Ошибка в алгоритме преобразования выражения в обратную польскую запись - C#
Формулировка задачи:
Метод
Из main-класса обращаюсь к методам вот так:
Где ошибка?
OPLConvert
принимает выражение в виде строки, например "2+2*2". Пока что без учета приоритета операторов хочу чтобы мне мой метод отдавал вот это "22+2*", но он отдает мне вот это "22+2" и я не могу найти ошибку. МетодOPLConvert
использует вспомогательный методIsOperator
определения цифры или оператора в строке. Ниже код обоих методов:static public bool IsOperator(char ch) { if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '^') return true; else return false; }
static public string OPLConvert(string expression) //МЕТОД ПРЕОБРАЗОВАНИЯ ВЫРАЖЕНИЯ В ОБРАТНУЮ ПОЛЬСКУЮ ЗАПИСЬ { string output = string.Empty; //Строка для хранения выражения (выходная строка) string input = expression; //Входная строка var operators = new Stack<byte>(); //стек для хранения операторов int i = 0; while (i != input.Length) // Пока есть ещё символы для чтения: { if (IsOperator(input[i]) == false) // Если символ является числом, { output += input[i]; //добавляем его к выходной строке. } else //ИНАЧЕ { if (operators.Count > 0) //Если в стеке есть элементы { output += (char)operators.Pop(); //То добавляем последний оператор из стека в строку с выражением } else // Если стек пуст { operators.Push((byte) input[i]); //добавляем оператор на вершину стека } } i++; //Читаем очередной символ. if (i == input.Length) //Когда прошли по всем символам, выкидываем из стека все оставшиеся там операторы в выходную строку { while (operators.Count > 0) { output += (char)operators.Pop(); } } } return output; //возвращаем выходную строку }
Console.WriteLine(OPL.OPLConvert("2+2*2"));
Решение задачи: «Ошибка в алгоритме преобразования выражения в обратную польскую запись»
textual
Листинг программы
if (operators.Count > 0) //Если в стеке есть элементы { output += (char)operators.Pop(); //То добавляем последний оператор из стека в строку с выражением operators.Push((byte)input[i]); //добавляем оператор на вершину стека } else // Если стек пуст { operators.Push((byte)input[i]); //добавляем оператор на вершину стека }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д