static private void AddStack(ref StackOfDouble top, double data) { StackOfDouble stack = new StackOfDouble(); stack.data = data; if (top == null) { stack.next = null; top = stack; } else { stack.next = top; top = stack; } }
static public double ReverseOutPolishNotation(string str) { System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US"); StackOfDouble top = null; string buffer; while (str != "") { buffer = MathExpression.GetMemberOfExpression(ref str); if (buffer != "+" && buffer != "-" && buffer != "*" && buffer != "/" && buffer != "^") { double data = Convert.ToDouble(buffer); AddStack(ref top, data); } else { if (buffer == "+") { double num1, num2; num1 = top.data; top = top.next; num2 = top.data; top = top.next; AddStack(ref top, num2 + num1); } else if (buffer == "-") { double num1, num2; num1 = top.data; top = top.next; num2 = top.data; top = top.next; AddStack(ref top, num2 - num1); } else if (buffer == "*") { double num1, num2; num1 = top.data; top = top.next; num2 = top.data; top = top.next; AddStack(ref top, num2 * num1); } else if (buffer == "/") { double num1, num2; num1 = top.data; top = top.next; num2 = top.data; top = top.next; AddStack(ref top, num2 / num1); } else if (buffer == "^") { double num1, num2; num1 = top.data; top = top.next; num2 = top.data; top = top.next; AddStack(ref top, Math.Pow(num2, num1)); } } } return(top.data); }