static void Main(string[] args) { StringLikeArray sla = new StringLikeArray(); Console.WriteLine("Введите формулу:"); SpaceInserter si = new SpaceInserter(Console.ReadLine()); si.InsertSpaces(); ShuntingYard sy = new ShuntingYard(si.GetOutputString()); sy.StringAnalys(); Console.WriteLine("Обратная польская запись:"); Console.WriteLine(sy.ReturnReversePolish()); ReversePolish rp = new ReversePolish(sy.ReturnReversePolish()); if (!rp.VariableCollect()) { Console.WriteLine("Переменных не обнаружено"); } else { Console.WriteLine("Введите значения переменных:"); } for (int i = 0; i < rp.VariableSet.Count; i++) { Variable v = (Variable)(rp.VariableSet[i]); Console.Write(v.var + " = "); v.value = Convert.ToDouble(Console.ReadLine()); rp.VariableSet[i] = v; } rp.Calculate(); Console.WriteLine("Результат: " + rp.Result); Console.ReadLine(); }
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(); }