Ошибка в алгоритме преобразования выражения в обратную польскую запись - 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]); //добавляем оператор на вершину стека
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д