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(' '); Stackstack = new Stack (); 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 stack) { decimal[] arr = stack.ToArray(); for (int i = arr.Length - 1; i >= 0; i--) { Console.Write("{0,-8:F3}", arr[i]); } Console.WriteLine(); } } }
Wednesday, December 19, 2012
Reverse polish notation in C#
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment