Обратная польская запись: элегантная альтернатива для вычисления математических выражений
Обратная польская запись (ОПЗ) — это эффективный метод вычисления математических выражений, отличающийся размещением операторов после операндов. Такой подход позволяет отказаться от использования скобок, упрощая и проясняя процесс вычислений. Хотя на первый взгляд это может показаться непривычным, использование ОПЗ значительно ускоряет выполнение операций, особенно в компьютерных системах и программируемых калькуляторах.

Существует множество способов записи математических выражений. Наиболее распространенным является инфиксная нотация, где операторы размещаются между операндами, как, например, в A + B
или (C D) - E
. Хотя эта нотация может показаться интуитивно понятной для нас, людей, она не всегда является оптимальным решением для компьютеров и калькуляторов. В этой статье мы рассмотрим менее известную, но, возможно, более элегантную альтернативу: обратную польскую запись (ОПЗ), также известную как постфиксная нотация.
Что такое обратная польская запись?
ОПЗ — это математическая нотация, в которой операторы следуют за своими операндами. Вместо того чтобы писать A + B
, в ОПЗ мы обозначаем это как A B +
. На первый взгляд это может показаться необычным, но ее преимущества быстро становятся очевидными.
Концепция ОПЗ берет свое начало от польского математика Яна Лукасевича, который в 1920-х годах разработал префиксную нотацию (польскую нотацию), где операторы предшествуют своим операндам. Постфиксная нотация является вариацией этого, которая была далее развита австралийским ученым-компьютерщиком Чарльзом Хэмблином в 1950-х годах для упрощения компьютерной обработки.
Почему ОПЗ полезна?
Основными преимуществами ОПЗ являются устранение неоднозначности и вычислительная эффективность. Инфиксная нотация требует скобок для уточнения порядка операций, и компьютерам нужны сложные алгоритмы синтаксического анализа, чтобы правильно обрабатывать приоритет операторов. В ОПЗ, однако, скобки не нужны, и порядок операций автоматически определяется структурой выражения.
Это было особенно важно для ранних компьютеров и карманных калькуляторов, где аппаратные ресурсы были ограничены. Калькуляторы, использующие ОПЗ, могли выполнять вычисления проще и быстрее.
Историческая справка: Нотация ОПЗ была впервые популяризирована компанией Hewlett-Packard (HP) в 1960-х и 70-х годах. Настольный калькулятор HP-9100A (1968) был одним из первых коммерчески доступных калькуляторов, использующих ОПЗ. Позже легендарный HP-35 (1972), первый научный карманный калькулятор, также использовал ОПЗ, и этот метод стал отличительной чертой профессиональных калькуляторов HP на долгое время. Калькуляторы ОПЗ славились своими быстрыми и точными вычислениями и приобрели большую популярность среди инженеров, ученых и финансовых специалистов.
Как работает ОПЗ
Давайте рассмотрим пример того, как работает ОПЗ. Рассмотрим инфиксное выражение: (3 + 4) 2 - 5
.
Сначала преобразуем это в ОПЗ. Для преобразования необходимо учесть порядок операций. В данном случае сначала выполняем сложение в скобках, затем умножение на два и, наконец, вычитание пяти. Выражение в ОПЗ будет выглядеть так: 3 4 + 2 5 -
.
Теперь давайте посмотрим, как вычислить это выражение ОПЗ, используя стек. Стек — это структура данных, в которую элементы можно помещать (push) и удалять (pop), при этом всегда извлекая последний вставленный элемент первым (LIFO — «последним вошел, первым вышел»).
Пошаговое вычисление выражения ОПЗ:
3
: Читаем3
. Это операнд, помещаем его в стек. Состояние стека:[3]
4
: Читаем4
. Также операнд, помещаем его в стек. Состояние стека:[3, 4]
+
: Читаем оператор+
. Извлекаем два операнда из стека (сначала4
, затем3
). Выполняем сложение:3 + 4 = 7
. Помещаем результат (7
) обратно в стек. Состояние стека:[7]
2
: Читаем2
. Операнд, помещаем в стек. Состояние стека:[7, 2]
: Читаем оператор
. Извлекаем два операнда из стека (сначала
2
, затем7
). Выполняем умножение:7 2 = 14
. Помещаем результат (14
) обратно в стек. Состояние стека:[14]
5
: Читаем5
. Операнд, помещаем в стек. Состояние стека:[14, 5]
-
: Читаем оператор-
. Извлекаем два операнда из стека (сначала5
, затем14
). Выполняем вычитание:14 - 5 = 9
. Помещаем результат (9
) обратно в стек. Состояние стека:[9]
Поскольку мы достигли конца выражения ОПЗ и в стеке остался только один элемент, этот элемент является окончательным результатом. Таким образом, значение выражения (3 + 4) 2 - 5
, вычисленного в ОПЗ, равно 9
.
Как преобразовать инфиксные выражения в ОПЗ?
Наиболее распространенным алгоритмом для преобразования инфиксных выражений в ОПЗ является алгоритм сортировочной станции, разработанный Эдсгером Дейкстрой. Этот алгоритм использует стек (для операторов и скобок) и выходную очередь (которая на практике может быть просто списком) для преобразования.
Шаги алгоритма сортировочной станции:
- Токенизация: Разбиваем инфиксное выражение на токены (числа, операторы, скобки).
- Инициализация: Создаем пустой стек для хранения операторов и пустую выходную очередь для построения выражения ОПЗ.
- Обработка токенов: Перебираем токены:
- Число: Если токен — число, добавляем его в выходную очередь.
- Оператор (op1): Если токен — оператор:
- Пока на вершине стека есть оператор (op2), И либо:
- op2 имеет более высокий приоритет, чем op1, ИЛИ
- op2 имеет равный приоритет с op1 И op1 левоассоциативен (в нашем примере все операторы левоассоциативны),
- Извлекаем op2 из стека и добавляем в выходную очередь.
- Помещаем op1 в стек.
- Пока на вершине стека есть оператор (op2), И либо:
- Левая скобка
(
: Помещаем ее в стек. - Правая скобка
)
:- Пока оператор на вершине стека не является левой скобкой:
- Извлекаем оператор из стека и добавляем в выходную очередь. (Если стек становится пустым до того, как найдена левая скобка, значит, скобки не согласованы.)
- Если на вершине стека есть левая скобка, извлекаем ее из стека (но не добавляем в выходную очередь — скобки не включаются в выражение ОПЗ).
- Если после обработки правой скобки на вершине стека нет левой скобки, значит, скобки не согласованы.
- Пока оператор на вершине стека не является левой скобкой:
- Очистка стека: Когда больше нет токенов для чтения, извлекаем все оставшиеся операторы из стека и добавляем их в выходную очередь.
- Результат: Выходная очередь теперь содержит выражение ОПЗ.
Приоритет и ассоциативность:
Понимание приоритета и ассоциативности операторов важно. Обычный порядок приоритета (от высшего к низшему):
- Умножение (
), Деление (
/
) - Сложение (
+
), Вычитание (-
)
Все четыре основные арифметические операции являются левоассоциативными, что означает, что операторы с одинаковым приоритетом вычисляются слева направо (например, a - b - c
= (a - b) - c
).
Пример преобразования инфиксного выражения (3 + 4) 2 - 5
в ОПЗ с использованием алгоритма сортировочной станции:
Токен | Выходная очередь | Стек операторов | Примечание |
---|---|---|---|
( | ( | Левая скобка помещена в стек. | |
3 | 3 | ( | Число добавлено в выходную очередь. |
+ | 3 | ( , + | Оператор помещен в стек. |
4 | 3 , 4 | ( , + | Число добавлено в выходную очередь. |
) | 3 , 4 , + | ( | Правая скобка: извлекаем операторы (+ ) в очередь, пока не будет найдена левая скобка. Извлекаем левую скобку. |
| 3 , 4 , + |
| Оператор помещен в стек (стек был пуст). |
2 | 3 , 4 , + , 2 |
| Число добавлено в выходную очередь. |
- | 3 , 4 , + , 2 ,
| - | Оператор: в стеке имеет более высокий приоритет, извлекаем в очередь. Помещаем - в стек. |
5 | 3 , 4 , + , 2 , , 5 | - | Число добавлено в выходную очередь. |
End | 3 , 4 , + , 2 , , 5 , - | Конец ввода: извлекаем оставшиеся операторы (- ) из стека в очередь. |
Таким образом, формой ОПЗ инфиксного выражения (3 + 4) 2 - 5
является: 3 4 + 2 * 5 -
.
Заключение
Обратная польская запись — это элегантный и эффективный метод для записи и вычисления математических выражений. Хотя на первый взгляд она может показаться менее интуитивной, чем инфиксная нотация, ОПЗ предлагает ряд преимуществ, особенно для компьютерной обработки. Она устраняет неоднозначность, не требует скобок и может быть эффективно вычислена с использованием простого стека. Алгоритм сортировочной станции представляет собой широко используемый и эффективный метод преобразования инфиксных выражений в ОПЗ.
Ее историческое значение неоспоримо, поскольку она сыграла важную роль в ранних карманных калькуляторах и остается актуальной концепцией в информатике сегодня, используясь в компиляторах и виртуальных машинах. Будучи менее распространенной в повседневном использовании, ОПЗ является ценным инструментом и способом мышления, который обеспечивает более глубокое понимание взаимосвязи между математическими выражениями и компьютерными операциями.