/// <summary> /// Evaluates the given list of tokens and returns the result. /// Tokens must appear in postfix order. /// </summary> /// <param name="tokens">List of tokens to evaluate.</param> /// <returns></returns> protected double ExecuteTokens(List <string> tokens) { Stack <double> stack = new Stack <double>(); double tmp, tmp2; foreach (string token in tokens) { // Is this a value token? double tokenValue = 0; if (double.TryParse(token, out tokenValue)) { stack.Push(tokenValue); } else if (token == "+") { stack.Push(stack.Pop() + stack.Pop()); } else if (token == "-") { tmp = stack.Pop(); tmp2 = stack.Pop(); stack.Push(tmp2 - tmp); } else if (token == "×" || token == "*") { stack.Push(stack.Pop() * stack.Pop()); } else if (token == "÷" || token == "/") { tmp = stack.Pop(); tmp2 = stack.Pop(); stack.Push(tmp2 / tmp); } else if (token == "^") { tmp = stack.Pop(); tmp2 = stack.Pop(); stack.Push(Math.Pow(tmp2, tmp)); } else if (token == UnaryMinus) { double value = stack.Pop(); if (value > 0) { stack.Push(-value); } } // Logical // AND else if (token == "&") { stack.Push(((long)stack.Pop()) & ((long)stack.Pop())); } // OR else if (token == "|") { stack.Push(((long)stack.Pop()) | ((long)stack.Pop())); } // XOR else if (token == "⊕") { stack.Push(((long)stack.Pop()) ^ ((long)stack.Pop())); } // RIGHT SHIFT else if (token == "<") { tmp = stack.Pop(); tmp2 = stack.Pop(); stack.Push(((long)tmp2) << ((int)tmp)); } // LEFT SHIFT else if (token == ">") { tmp = stack.Pop(); tmp2 = stack.Pop(); stack.Push(((long)tmp2) >> ((int)tmp)); } // LEFT SHIFT else if (token == "%") { tmp = stack.Pop(); tmp2 = stack.Pop(); stack.Push((long)tmp2 % (int)tmp); } //Statistical else if (token == "P") { tmp = stack.Pop(); tmp2 = stack.Pop(); // n! / (n-k)! double val = double.Parse(Calc_MainPage.factorial(tmp2)) / double.Parse(Calc_MainPage.factorial(tmp2 - tmp)); stack.Push(val); } else if (token == "C") { tmp = stack.Pop(); tmp2 = stack.Pop(); // n! / (k! * (n-k)!) double val = double.Parse(Calc_MainPage.factorial(tmp2)) / (double.Parse(Calc_MainPage.factorial(tmp2 - tmp)) * double.Parse(Calc_MainPage.factorial(tmp))); stack.Push(val); } } // Remaining item on stack contains result return((stack.Count > 0) ? stack.Pop() : 0.0); }