Вы находитесь на странице: 1из 5

Министерство образования Республики Беларусь

Учреждение образования
«БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ»
Институт информационных технологий

Специальность Программное обеспечение информационных технологий

Реферат на тему
Правило вычисления выражения в постфиксной записи.

Вариант № 26

Студент-заочник 2 курса
Группы № 981073
ФИО Селедцова Елизавета
Олеговна

Минск, 2021
Обра́тная по́льская запись (англ. Reverse Polish notation, RPN) — форма записи
математических и логических выражений, в которой операнды расположены перед
знаками операций. Также именуется как обратная бесскобочная запись, постфиксная
нотация, бесскобочная символика Лукасевича, польская инверсная запись, ПОЛИЗ.
Постфиксная запись представляет собой такую запись арифметического
выражения, в которой сначала записываются операнды, а затем – знак операции.
Например, для выражения a + b * c постфиксная запись будет a b c * +. Здесь операндами
операции * будут b и c (два ближайших операнда), а операндами операции + будут а и
составной операнд b c *. Эта запись удобна тем, что она не требует скобок. Например, для
выражения (a + b) * c постфиксная запись будет a b + c *. В этой записи не требуется
ставить скобки для того, чтобы изменить порядок вычисления, зависящий от приоритета
операций, как в исходном выражении.
Чтобы разобраться в этом более детально, рассмотрим постфиксное выражение 4 5
6 * +. Сканируя его слева направо, вы прежде всего натолкнётесь на операнды 4 и 5. Что с
ними делать неизвестно, пока не известен следующий символ. Помещение каждого из них
в стек гарантирует их доступность на случай, если следующим появится оператор.
В данном случае следующий символ - ещё один операнд. Так что мы, как и раньше,
помещаем его в стек и проверяем следующий символ. Видим оператор *, что означает
перемножение двух самых последних операндов. Сделав выталкивание из стека дважды,
получим необходимые множители, а затем выполним умножение (в данном случае
результатом будет 30).
Теперь можно обработать полученное значение, поместив его обратно в стек,
чтобы оно могло использоваться в качестве операнда для последующих операторов в
выражении. Когда будет обработан последний оператор, в стеке останется только одно
значение. Выталкиваем его и возвращаем как результат
выражения. Рисунок демонстрирует содержание стека на протяжении всего процесса
вычисления выражения из примера.
Рисунок 1 - Содержание стека в процессе вычисления

На рисунке 2 показан несколько более сложный пример: 7 8 + 3 2 + /. Здесь есть два


момента, которые стоит отметить. Первый: размер стека возрастает, уменьшается и вновь
растёт в процессе вычисления подвыражений. Второй: обрабатывать оператор деления
нужно очень внимательно. Напомним, что операнды в постфиксном выражении идут в их
изначальном порядке, поскольку постфикс меняет только положение оператора. Когда
операнды деления выталкиваются из стека, они находятся в обратной последовательности.
Поскольку деление не коммутативный оператор (другими словами, \(15/5\) не то же самое,
что \(5/15\)), мы должны быть уверены, что порядок операндов не изменился.

Рисунок 2 - Более
сложный пример
вычисления

Предположим, что постфиксное выражение - это строка токенов, разделённых


пробелами. Операторами являются *, /, + и -, а под операндами понимаются
одноразрядные целые значения. На выходе будет целочисленный результат.
Правило вычисления выражения в обратной польской записи состоит в
следующем. Обратная польская запись просматривается слева направо. Если очередной
элемент – операнд, то происходит переход к следующему элементу. Если текущий
элемент – знак операции, то над операндами, записанными левее знака операции,
выполняется данная операция. Ее результат записывается вместо первого (самого левого)
операнда, участвовавшего в операции. Остальные элементы (операнды и знак операции),
участвовавшие в операции, вычеркиваются из записи. Просмотр продолжается. В
результате последовательного выполнения изложенного правила будут выполнены все
операции в выражении, и запись сократится до одного элемента – результата вычисления
выражения.
Для управления порядком выполнения операций над операндами исполь- зуется
скобочная запись выражений. При вычислении сначала вычисляется часть выражения,
скобочный уровень вложенности которой самый высокий. При наличии нескольких
операторов с наивысшим скобочным уровнем, они вычисляются слева направо. При
вычислении выражений с операциями, кото- рым присвоен приоритет, или частично
скобочных выражениях инфиксной формы записи, необходимо повторное сканирование
слева направо. Повторное сканирование можно исключить, если инфиксное выражение
преобразовать в постфиксную или префиксную форму записи.
Основные правила выполнения постфиксного выражения:
1) найти в выражении крайний левый оператор;
2) выбрать два операнда, стоящих непосредственно слева от найденного
оператора;
3) выполнить операцию;
4) заменить оператор и операнды результатом;
5) повторять указанные действия, пока не будут обработаны все операнды.
Постфиксное и префиксное выражения корректны тогда и только тогда,
когда ранг выражения равен 1, а ранг любой правой головы польской формулы больше
(меньше) или равен 1. Ранг корректного выражения равен 1.
Алгебраическое преобразование инфиксного выражения в обратное польское
основано на приоритетах операторов и предлагает использование стека. Обратное
польское выражение хранится в виде выходной строки, используемой в дальнейшем при
генерации объектного кода.
В ходе преобразования инфиксного выражения в обратное польское поря- док
всех переменных и констант не меняется, а порядок операторов выходной строки
соответствует их приоритетам (табл. 1).

Таблица 1
Символ Приоритет Ранг

+,– 1 –1

*, / 2 –1
A,b,…, z 3 1

Дно стека 0 –

Алгоритм преобразования.
1. В стек помещается признак пустого стека.
2. Значение приоритета очередного входного символа сравнивается с при-
оритетом верхнего элемента стека.
3. Если приоритет символа больше приоритета верхнего элемента стека, то
символ помещается в стек, выбирается следующий входной символ.
4. Если приоритет входного символа меньше или равен приоритету верхне- го
элемента стека, то этот элемент удаляется из стека и помещается в форми- руемую строку,
после чего сравниваются приоритеты очередного символа и но- вого верхнего символа.
Каждый раз при изменении обратной польской записи пересчитывается ранг
результирующего выражения.