Talk:Parsing/RPN calculator algorithm: Difference between revisions

From Rosetta Code
Content added Content deleted
 
(Blanked the page)
Line 1: Line 1:
=={{header|C sharp|C#}}==
<lang csharp>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Globalization;
using System.Threading;

namespace RPNEvaluator
{
class RPNEvaluator
{
static void Main(string[] args)
{
Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;

string rpn = "3 4 2 * 1 5 - 2 3 ^ ^ / +";
Console.WriteLine("{0}\n", rpn);

decimal result = CalculateRPN(rpn);
Console.WriteLine("\nResult is {0}", result);
}

static decimal CalculateRPN(string rpn)
{
string[] rpnTokens = rpn.Split(' ');
Stack<decimal> stack = new Stack<decimal>();
decimal number = decimal.Zero;

foreach (string token in rpnTokens)
{
if (decimal.TryParse(token, out number))
{
stack.Push(number);
}
else
{
switch (token)
{
case "^":
case "pow":
{
number = stack.Pop();
stack.Push((decimal)Math.Pow((double)stack.Pop(), (double)number));
break;
}
case "ln":
{
stack.Push((decimal)Math.Log((double)stack.Pop(), Math.E));
break;
}
case "sqrt":
{
stack.Push((decimal)Math.Sqrt((double)stack.Pop()));
break;
}
case "*":
{
stack.Push(stack.Pop() * stack.Pop());
break;
}
case "/":
{
number = stack.Pop();
stack.Push(stack.Pop() / number);
break;
}
case "+":
{
stack.Push(stack.Pop() + stack.Pop());
break;
}
case "-":
{
number = stack.Pop();
stack.Push(stack.Pop() - number);
break;
}
default:
Console.WriteLine("Error in CalculateRPN(string) Method!");
break;
}
}
PrintState(stack);
}

return stack.Pop();
}

static void PrintState(Stack<decimal> stack)
{
decimal[] arr = stack.ToArray();

for (int i = arr.Length - 1; i >= 0; i--)
{
Console.Write("{0,-8:F3}", arr[i]);
}
Console.WriteLine();
}
}
}</lang>
Output:
<pre>
3 4 2 * 1 5 - 2 3 ^ ^ / +

3.000
3.000 4.000
3.000 4.000 2.000
3.000 8.000
3.000 8.000 1.000
3.000 8.000 1.000 5.000
3.000 8.000 -4.000
3.000 8.000 -4.000 2.000
3.000 8.000 -4.000 2.000 3.000
3.000 8.000 -4.000 8.000
3.000 8.000 65536.000
3.000 0.000
3.000

Result is 3.0001220703125
</pre>

Revision as of 11:54, 21 January 2012