Ошибка в алгоритме преобразования выражения в обратную польскую запись - C#

Узнай цену своей работы

Формулировка задачи:

Метод

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; //возвращаем выходную строку
        }
Из main-класса обращаюсь к методам вот так:
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]); //добавляем оператор на вершину стека
  }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.714 из 5
Похожие ответы