Talk:Parsing/RPN calculator algorithm

From Rosetta Code
Revision as of 11:48, 21 January 2012 by 130.204.189.8 (talk) (→‎{{header|C sharp|C#}})
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

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:

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