private static void TestArithmetic() { do { Console.Clear(); Console.Write("Введите арифметическое выражение: "); string expression = Console.ReadLine(); string convertedExpression = PolishArithmetic.GetPolishNotation(expression); Console.WriteLine("\nВыражение в обратной польской нотации: {0}", convertedExpression); string result = PolishArithmetic.CalculatePolishExpression(convertedExpression); Console.Write("\nРезультат вычисления: "); if (!Char.IsLetter(result[0])) { Console.Write(result); } Console.WriteLine(); PolishArithmetic.SetVars(); foreach (KeyValuePair <string, string> p in PolishArithmetic.Vars) { Console.WriteLine(p.Key + " = " + p.Value); } PolishArithmetic.Vars.Clear(); Console.WriteLine("\n(Нажмите ESC, чтобы выйти)"); }while (Console.ReadKey().Key != ConsoleKey.Escape); }
// Вычисляет выражение, переведенное в обратную польскую запись public static string CalculatePolishExpression(List <string> polishExpression) { // a 0 > 11 !F a a ~ = 16 !! a b 1 + = $ int currentPosition = 0; List <string> expressionBuffer = new List <string>(); string Result = ""; while (currentPosition < polishExpression.Count) { if (polishExpression[currentPosition] == "$") { if (expressionBuffer.Count != 0) { string arithmeticExpression = ""; foreach (string s in expressionBuffer) { arithmeticExpression += s + " "; } arithmeticExpression = arithmeticExpression.Remove(arithmeticExpression.Length - 1); Result = PolishArithmetic.CalculatePolishExpression(arithmeticExpression); } break; } else if (polishExpression[currentPosition] == "!F") { string transition = expressionBuffer[expressionBuffer.Count - 1]; expressionBuffer.RemoveAt(expressionBuffer.Count - 1); string logicExpression = ""; foreach (string s in expressionBuffer) { logicExpression += s + " "; } logicExpression = logicExpression.Remove(logicExpression.Length - 1); string logicResult = PolishArithmetic.CalculatePolishExpression(logicExpression, true); expressionBuffer.Clear(); if (logicResult == "0") { currentPosition = Convert.ToInt32(transition); continue; } } else if (polishExpression[currentPosition] == "!!") { string transition = expressionBuffer[expressionBuffer.Count - 1]; expressionBuffer.RemoveAt(expressionBuffer.Count - 1); string arithmeticExpression = ""; foreach (string s in expressionBuffer) { arithmeticExpression += s + " "; } arithmeticExpression = arithmeticExpression.Remove(arithmeticExpression.Length - 1); Result = PolishArithmetic.CalculatePolishExpression(arithmeticExpression); currentPosition = Convert.ToInt32(transition); expressionBuffer.Clear(); continue; } else { expressionBuffer.Add(polishExpression[currentPosition]); } currentPosition++; } return(Result); }