public double GetCalculation(string expression)
        {
            double result = 0;
            ExpressionToReversePolish expressionToReversePolish = new ExpressionToReversePolish();
            ReversePolishOperations   reversePolishOperations   = new ReversePolishOperations();
            List <string>             reversePolish             = expressionToReversePolish.GetReversePolish(expression);
            Stack <double>            equateStack = new Stack <double>();

            foreach (string element in reversePolish)
            {
                if (reversePolishOperations.IsStatement(element))
                {
                    result = StackEquation(equateStack, element);
                    equateStack.Push(result);
                }
                else
                {
                    equateStack.Push(Convert.ToDouble(element));
                }
            }

            return(result);
        }
Пример #2
0
        public List <string> GetReversePolish(string expression)
        {
            List <string> result         = new List <string>();
            Stack <char>  statementStack = new Stack <char>();

            expression = expression.Replace(" ", String.Empty);
            expression = expression.Replace(".", ",");
            ReversePolishOperations reversePolishOperations = new ReversePolishOperations();

            Console.WriteLine(expression);

            for (int index = 0; index < expression.Length; index++)
            {
                if (reversePolishOperations.IsNumberOrFractional(expression[index]))
                {
                    string number = String.Empty;

                    while ((index != expression.Length) && (reversePolishOperations.IsNumberOrFractional(expression[index])))
                    {
                        number += expression[index];
                        index++;
                    }

                    result.Add(number);
                    if (index == expression.Length)
                    {
                        break;
                    }
                }

                if (reversePolishOperations.IsStatement(expression[index]))
                {
                    if (expression[index] == '(')
                    {
                        statementStack.Push(expression[index]);
                    }
                    else if (expression[index] == ')')
                    {
                        char statement = statementStack.Pop();

                        while (statement != '(')
                        {
                            result.Add(statement.ToString());
                            statement = statementStack.Pop();
                        }
                    }
                    else
                    {
                        while ((statementStack.Count != 0) && (reversePolishOperations.PriorityCheck(expression[index]) <= reversePolishOperations.PriorityCheck(statementStack.Peek())))
                        {
                            result.Add(statementStack.Pop().ToString());
                        }
                        statementStack.Push(expression[index]);
                    }
                }
            }

            while (statementStack.Count() > 0)
            {
                result.Add(statementStack.Pop().ToString());
            }

            return(result);
        }