Ejemplo n.º 1
0
        /// <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);
        }