Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лекции / postfisso

.html
Скачиваний:
10
Добавлен:
28.06.2014
Размер:
26.21 Кб
Скачать

Постфиксная запись Постфиксная запись Постфиксная запись представляет собой такую запись арифметического выражения, в которой сначала записываются операнды, а затем – знак операции. Например, для выражения a + b * c постфиксная запись будет a b c * +. Здесь операндами операции * будут b и c (два ближайших операнда), а операндами операции + будут а и составной операнд b c *. Эта запись удобна тем, что она не требует скобок. Например, для выражения (a + b) * c постфиксная запись будет a b + c *. В этой записи не требуется ставить скобки для того, чтобы изменить порядок вычисления, зависящий от приоритета операций, как в исходном выражении. Алгоритм перевода в постфиксную запись обрабатывает исходный массив лексем и строит новый массив из тех же лексем, расположенных в другом порядке. Кроме того, необходим еще стек – аналогичный массив, используемый для временного хранения операций. Алгоритм перевода выражения в постфиксную запись следующий. Константы и переменные кладутся в формируемую запись в порядке их появления в исходном массиве. При появлении операции в исходном массиве: если в стеке нет операций или верхним элементом стека является открывающая скобка, операции кладётся в стек; если новая операции имеет больший* приоритет, чем верхняя операции в стеке, то новая операции кладётся в стек; если новая операция имеет меньший или равный приоритет, чем верхняя операции в стеке, то операции, находящиеся в стеке, до ближайшей открывающей скобки или до операции с приоритетом меньшим, чем у новой операции, перекладываются в формируемую запись, а новая операции кладётся в стек. Открывающая скобка кладётся в стек. Закрывающая скобка выталкивает из стека в формируемую запись все операции до ближайшей открывающей скобки, открывающая скобка удаляется из стека. После того, как мы добрались до конца исходного выражения, операции, оставшиеся в стеке, перекладываются в формируемое выражение. Примеры

a + b * c Обрабатываемая лексема Результат Стек Пункт алгоритма a a   1 + a + 2a b a b + 1 * a b + * 2b c a b c + * 1   a b c * +   5 Обратите внимание, что после перекладывания операции из стека в результат при завершении работы алгоритма, порядок операций сменился на противоположный.

a + b - c * d Обрабатываемая лексема Результат Стек Пункт алгоритма a a   1 + a + 2a b a b + 1 - a b + - 2b c a b c + - 1 * a b c + - * 2b d a b c d + - * 1   a b c d * - +   5

a + b * c - d Обрабатываемая лексема Результат Стек Пункт алгоритма a a   1 + a + 2a b a b + 1 * a b + * 2b c a b c + * 1 - a b c * + - 2c d a b c * + d - 1   a b c * + d -   5

(a + b) * c Обрабатываемая лексема Результат Стек Пункт алгоритма (   ( 3 a a ( 1 + a ( + 2a b a b ( + 1 ) a b +   4 * a b + * 2a c a b + c * 1   a b + c *   5

(a + b * c) / 2 Обрабатываемая лексема Результат Стек Пункт алгоритма (   ( 3 a a ( 1 + a ( + 2a b a b ( + 1 * a b ( + * 2b c a b c ( + * 1 ) a b c * +   4 / a b c * + / 2a 2 a b c * + 2 / 1   a b c * + 2 /   5

(a * (b + c) + d) / 2 Обрабатываемая лексема Результат Стек Пункт алгоритма (   ( 3 a a ( 1 * a ( * 2a ( a ( * ( 3 b a b ( * ( 1 + a b ( * ( + 2a c a b c ( * ( + 1 ) a b c + ( * 4 + a b c + * ( + 2c d a b c + * d ( + 1 ) a b c + * d +   4 / a b c + * d + / 2a 2 a b c + * d + 2 / 1   a b c + * d + 2 /   5

a && b == c Обрабатываемая лексема Результат Стек Пункт алгоритма a a   1 && a && 2a b a b && 1 == a b && == 2b c a b c && == 1   a b c == &&   5

a == b && c || a != d Обрабатываемая лексема Результат Стек Пункт алгоритма a a   1 == a == 2a b a b == 1 && a b == && 2c c a b == c && 1 || a b == c && || 2c a a b == c && a || 1 != a b == c && a || != 2b d a b == c && a d || != 1   a b == c && a d != ||   5

(a || b) && !c Обрабатываемая лексема Результат Стек Пункт алгоритма (   ( 3 a a ( 1 || a ( || 2a b a b ( || 1 ) a b ||   4 && a b || && 2a ! a b || && ! 2b c a b || c && ! 1   a b || c ! &&   5 Расширить этот алгоритм так, чтобы он обрабатывал выражения, содержащие вызовы функций несложно. Для удобства перевода выражения в постфиксную запись в синтаксическом анализаторе необходимо в список лексем сначала класть открывающую скобку, а затем имя функции. В алгоритме перевода в постфиксную запись появляется новый пункт: Имя функции кладётся в стек и выталкивается оттуда только закрывающей скобкой.

x + (sin x) * 2 Обрабатываемая лексема Результат Стек Пункт алгоритма x x   1 + x + 2a ( x + ( 3 sin x + ( sin 6 x x x + ( sin 1 ) x x sin + 4 * x x sin + * 2b 2 x x sin 2 + * 1   x x sin 2 * +   5

a + (sin (b + c)) Обрабатываемая лексема Результат Стек Пункт алгоритма a a   1 + a + 2a ( a + ( 3 sin a + ( sin 6 ( a + ( sin ( 3 b a b + ( sin ( 1 + a b + ( sin ( + 2a c a b c + ( sin ( + 1 ) a b c + + ( sin 4 ) a b c + sin + 4   a b c + sin +   5

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

Вычислим значение выражения a b c + * d + 2 / при а = 1, b = 2, c = 3, d = 4 Обрабатываемая лексема Стек a 1 b 1 2 c 1 2 3 + 1 5 * 5 d 5 4 + 9 2 9 2 / 4.5

Вычислим значение выражения x x sin 2 * + при x = 3.14 Обрабатываемая лексема Стек x 3.14 x 3.14 3.14 sin 3.14 0 2 3.14 0 2 * 3.14 0 + 3.14

Вычислим значение выражения a b || c ! && при a = 0, b = 2, c = 0 Обрабатываемая лексема Стек a 0 b 0 2 || 1 c 1 0 ! 1 1 && 1

Файл в формате Word

Содержание

* Операции * и / имеют равный приоритет, который больше приоритета операций + и -. Операции + и - также имеют равный приоритет. Операции сравнения имеют больший приоритет, чем логические операции. Операция «НЕ» имеет больший приоритет, чем операция «И» , а «И» имеет больший приоритет, чем операция «ИЛИ».

Соседние файлы в папке Лекции