Talk:Parsing/RPN calculator algorithm: Difference between revisions
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> |