История:
Обратная польская запись была предложена Берксом, Уорреном и Райтом в 1954 году и названа так потому, что она была просто обратной польской записи (префиксной записи), изобретенной польским логиком Яном Лукасевичем, в которой оператор ставится перед операндами. В 1960-х годах он был затем независимо заново изобретен Э. В. Дейкстрой и Ф. Л. Bauer за сокращение количества обращений к компьютерной памяти и повышение производительности. Он использовал стек компьютера для хранения своих операндов перед выполнением оператора.
Определение:
Обратная польская нотация (RPN) — это метод передачи математических выражений без использования разделителей, таких как квадратные и круглые скобки. В этой нотации операторы следуют за своими операндами, что устраняет необходимость в квадратных скобках для определения приоритета оценки. Операция читается слева направо, но выполнение выполняется каждый раз при достижении оператора и всегда с использованием двух последних чисел в качестве операндов. Эта нотация подходит для компьютеров и калькуляторов, поскольку требуется отслеживать меньше символов и выполнять меньше операций.
Обратное польское обозначение также известно как постфиксное обозначение.
Способ:
RPN приводит к более быстрым вычислениям по нескольким причинам. Во-первых, меньше информации для хранения. Следовательно, вместо того, чтобы хранить девять символов для выражения ((5–3) * 2), компьютерам, использующим RPN, нужно хранить только пять символов для выражения 5 3–2 *. А поскольку для обработки требуется меньше символов, выполнение становится быстрее.
Итак, в компьютере, использующем RPN, вычисление выражения 5 1–3 * выглядит следующим образом:
- Вставьте 5 в стек. Это первое значение.
- Поместите 1 в стек. Это второе значение, и оно находится на позиции выше 5.
- Примените операцию вычитания, взяв из стека два операнда (1 и 5). Верхнее значение (1) вычитается из значения под ним (5), а результат (4) сохраняется обратно в стек. 4 теперь единственное значение в стеке и находится внизу.
- Вставьте 3 в стек. Это значение находится в позиции выше 4 в стеке.
- Примените операцию умножения, взяв два последних числа из стека и перемножив их. Затем результат помещается обратно в стек. После этой операции стек теперь содержит только число 12.
Инфиксное выражение ((15 ÷ (7 - (1 + 1))) × 3) - (2 + (1 + 1)) можно записать в обратной польской записи следующим образом:
15 7 1 1 + − ÷ 3 × 2 1 1 + + −
- Вычисление этого постфиксного выражения с помощью приведенного выше алгоритма слева направо дает результат (красные элементы — это содержимое стека, полужирный — текущий токен):
15 7 1 1 + − ÷ 3 × 2 1 1 + + − = 15 7 1 1 + − ÷ 3 × 2 1 1 + + − = 15 7 1 1 + − ÷ 3 × 2 1 1 + + − = 15 7 1 1 + − ÷ 3 × 2 1 1 + + − = 15 7 1 1 + − ÷ 3 × 2 1 1 + + − = 15 7 2 − ÷ 3 × 2 1 1 + + − = 15 5 ÷ 3 × 2 1 1 + + − = 3 3 × 2 1 1 + + − = 3 3 × 2 1 1 + + − = 9 2 1 1 + + − = 9 2 1 1 + + − = 9 2 1 1 + + − = 9 2 1 1 + + − = 9 2 2 + − = 9 4 − = 5 = 5
- Вычисление этого постфиксного выражения с помощью приведенного выше алгоритма справа налево дает:
15 7 1 1 + − ÷ 3 × 2 1 1 + + − = 15 7 1 1 + − ÷ 3 × 2 2 + − = 15 7 1 1 + − ÷ 3 × 4 − = 15 7 2 − ÷ 3 × 4 − = 15 5 ÷ 3 × 4 − = 3 3 × 4 − = 9 4 − = 5
Обратная польская нотация — это способ выражения арифметических выражений, который позволяет избежать использования скобок для определения приоритетов при вычислении операторов. В обычных обозначениях можно было бы написать
(3 + 5) * (7–2)
а скобки говорят нам, что мы должны прибавить 3 к 5, затем вычесть 2 из 7 и умножить два результата вместе. В RPN номера и операторы перечислены один за другим, и оператор всегда действует на самые последние номера в списке. Числа можно представить себе как образующие стопку, как стопку тарелок. Самое последнее число помещается на вершину стека. Оператор берет соответствующее количество аргументов с вершины стека и заменяет их результатом операции.
Следующий пример:
В этих обозначениях приведенное выше выражение будет
3 5 + 7 2 — *
Если читать слева направо, это интерпретируется следующим образом:
- Вставьте 3 в стек.
- Вставьте 5 в стек. Если читать сверху, стек теперь содержит (5, 3).
- Примените операцию +: возьмите два верхних числа из стека, сложите их вместе и поместите результат обратно в стек. Теперь стек содержит только число 8.
- Поместите 7 в стек.
- Вставьте 2 в стек. Теперь он содержит (2, 7, 8).
- Примените операцию —: возьмите два верхних числа из стека, вычтите верхнее из нижнего и поместите результат обратно в стек. Стек теперь содержит (5, 8).
- Примените операцию *: возьмите два верхних числа из стека, перемножьте их и поместите результат обратно в стек. Теперь стек содержит только число 40.
Спасибо