Так же, как и вычисление значений выражений в обратной польской записи, алгоритм работает при помощи
стека
. Инфиксная запись математических выражений чаще всего используется людьми, её примеры: 2+4 и 3+6*(3-2). Для преобразования в обратную польскую нотацию используется 2 строки: входная и выходная, и стек для хранения операторов, ещё не добавленных в выходную очередь. При преобразовании алгоритм считывает 1 символ и производит действия, зависящие от данного символа.
Если токен —
разделитель аргументов функции
(например, запятая):
Пока токен на вершине стека не
открывающая скобка:
Переложить оператор из стека в выходную очередь.
Если стек закончился до того, как был встречен токен
открывающая скобка
, то в выражении пропущен
разделитель аргументов функции
(запятая), либо пропущена
открывающая скобка
.
Если токен —
оператор
op1, то:
Пока присутствует на вершине стека токен
оператор
op2, чей приоритет выше или равен приоритету op1, и при равенстве приоритетов op1 является
левоассоциативным
:
Переложить op2 из стека в выходную очередь;
Положить op1 в стек.
Если токен —
открывающая скобка
, то положить его в стек.
Если токен —
закрывающая скобка
:
Пока токен на вершине стека не
открывающая скобка
Переложить оператор из стека в выходную очередь.
Если стек закончился до того, как был встречен токен
открывающая скобка
, то в выражении пропущена скобка.
Выкинуть
открывающую скобку
из стека, но не добавлять в очередь вывода.
Если токен на вершине стека — функция, переложить её в выходную очередь.
Если больше не осталось токенов на входе:
Пока есть токены операторы в стеке:
Если токен оператор на вершине стека —
открывающая скобка
, то в выражении пропущена скобка.
Переложить оператор из стека в выходную очередь.
Конец.
Каждый токен-число, функция или оператор выводится только один раз, а также каждый токен-функция, оператор или круглая скобка будет добавлен и удалён из стека по одному разу. Постоянное количество операций на токен, линейная сложность алгоритма O(
n
).