public void StringAnalys() { SpaceInserter si = new SpaceInserter(InputString); si.InsertSpaces(); InputString = si.GetOutputString(); // с пробелами разбираемся if (!(new CorrectFormula(InputString).IsCorrect())) { OutputString = ""; return; } // проверка на допустимость формулы if (InputString.Length == 0) { OutputString = ""; return; } StringLikeArray sla = new StringLikeArray(); ArrayList tokenList = new ArrayList(); tokenList = sla.CreateArray(InputString); // разбили строку на массив лексем for (int i = 0; i < tokenList.Count; i++) { if (ac.IsNumber((string)tokenList[i]) | ac.IsVariable((string)tokenList[i])) { OutputString += tokenList[i] + " "; // если строка или переменная, то записали в выходную строку } Statement currentStatement = ac.IsStatement((string)tokenList[i]); // а вот если оператор... if (currentStatement != null) { if (currentStatement.st == StateType.isOpen) // открывающую скобку сразу в стек { SYStack.Push(currentStatement.symbol); } if (currentStatement.st == StateType.isClose) // если закрывающая, то достаем все из стека в выходную строку { string str = SYStack.Pop(); while (ac.IsStatement(str).st != StateType.isOpen) { OutputString += str + " "; str = SYStack.Pop(); } } if ((currentStatement.st == StateType.isStatementLeft) | (currentStatement.st == StateType.isStatementRight)) { // если на вершине стека более крутая операция чем новая, то перенесли ее в выходную строку bool doIt = true; // если менее крутая, то текущую в стек скинули while (doIt) { if (SYStack.Count == 0) { SYStack.Push(currentStatement.symbol); doIt = false; } else { string top = SYStack.Peek(); if ((currentStatement.priority > ac.IsStatement(top).priority & currentStatement.st == StateType.isStatementLeft) | (currentStatement.priority >= ac.IsStatement(top).priority & currentStatement.st == StateType.isStatementRight)) { SYStack.Push(currentStatement.symbol);// текущую воткнули в стек doIt = false; } else { OutputString += SYStack.Pop() + " "; } } } } } } while (SYStack.Count > 0) { OutputString += SYStack.Pop() + " "; } OutputString = OutputString.Trim(); }
public static double Calculate(string formula) { StringLikeArray sla = new StringLikeArray(); SpaceInserter si = new SpaceInserter(formula.Replace(",",".")); si.InsertSpaces(); ShuntingYard sy = new ShuntingYard(si.GetOutputString()); sy.StringAnalys(); ReversePolish rp = new ReversePolish(sy.ReturnReversePolish()); rp.Calculate(); return rp.Result; }