Введение

Алгоритм преобразования синтаксиса из инфиксной нотации в постфиксную нотацию

В информатике алгоритм сортировочной станции — это метод разбора арифметических или логических выражений, или их комбинации, заданных в инфиксной нотации. Он может генерировать либо строку в постфиксной нотации, также известной как обратная польская нотация (RPN), либо абстрактное синтаксическое дерево (AST). Алгоритм был изобретен Эдсгером Дейкстрой и назван алгоритмом «сортировочной станции», поскольку его работа напоминает работу железнодорожной сортировочной станции. Дейкстра впервые описал алгоритм сортировочной станции в отчете Mathematisch Centrum MR 34/61. Как и вычисление RPN, алгоритм сортировочной станции основан на стеке. Инфиксные выражения — это форма математической записи, к которой привыкли большинство людей, например, «3 + 4» или «3 + 4 × (2 − 1)». Для преобразования используются две текстовые переменные (строки): входные данные и выходные данные. Также используется стек, который хранит операторы, еще не добавленные в выходную очередь. Для преобразования программа последовательно считывает каждый символ и выполняет определенное действие в зависимости от этого символа. Результатом для приведенных выше примеров (в обратной польской нотации) будут «3 4 +» и «3 4 2 1 − × +» соответственно. Алгоритм сортировочной станции правильно разбирает все допустимые инфиксные выражения, но не отклоняет все недопустимые выражения. Например, «1 2 +» не является допустимым инфиксным выражением, но будет разобрано как «1 + 2». Однако алгоритм может отклонить выражения с несбалансированными скобками. Алгоритм сортировочной станции впоследствии был обобщен в разбор с учетом приоритета операторов.

Графическая иллюстрация

Графическая иллюстрация алгоритма, использующая трехпутный железнодорожный перекресток. Вход обрабатывается по одному символу за раз: если найден символ, являющийся переменной или числом, он копируется непосредственно в выход a), c), e), h). Если символ является оператором, он помещается в стек операторов b), d), f). Если приоритет оператора ниже приоритета операторов на вершине стека или приоритеты равны и оператор является левоассоциативным, то этот оператор извлекается из стека и добавляется в выход g). Наконец, все оставшиеся операторы извлекаются из стека и добавляются в выход i).