Зачем нам нужен префикс, постфиксная запись

Я знаю, как каждый из них может быть преобразован друг в друга, но никогда не понимал, что их приложения. Обычная инфиксная операция вполне читабельна, но где она терпит неудачу, что привело к появлению префиксной и постфиксной нотации

4 ответа

Решение

Нотация с инфиксом легко читается людьми, тогда как нотация с префиксом / постфиксом легче разбирается для машины. Большим преимуществом префикса / постфикса является то, что никогда не возникает таких вопросов, как приоритет оператора.

Например, рассмотрим выражение инфикса 1 # 2 $ 3, Теперь мы не знаем, что означают эти операторы, поэтому существует два возможных соответствующих выражения postfix: 1 2 # 3 $ а также 1 2 3 $ #, Не зная правил, регулирующих использование этих операторов, инфиксное выражение по сути бесполезно.

Или, если выразить это в более общих терминах: можно восстановить исходное дерево (синтаксический анализ) из выражения пре-/ постфикса без каких-либо дополнительных знаний, но это не относится к выражениям инфикса.

Обозначение Postfix, также известное как RPN, очень легко обрабатывать слева направо. Операнд помещается в стек; оператор извлекает свои операнды из стека и выводит результат. Небольшой или никакой разбор необходим. Он используется Forth и некоторыми калькуляторами (HP калькуляторы известны для использования RPN).

Обозначение префикса почти так же легко обрабатывается; это используется в Лиспе.

По крайней мере, в случае префиксной нотации: преимущество использования префиксного оператора состоит в том, что синтаксически он читается так, как будто оператор является вызовом функции.

Другой аспект префикса / постфикса по сравнению с инфиксом заключается в том, что арность оператора (к скольким аргументам он применяется) больше не должна быть ограничена ровно 2. Она может быть больше, а иногда и меньше (0 или 1, когда значения по умолчанию подразумевается, естественно, как ноль для сложения / вычитания, один для умножения / деления).

В случае инфиксного выражения время, необходимое для оценки, составляет O(n^2) Причина - приоритет операторов. Пример: a+b*c В этом случае мы не будем напрямую оценивать a + b. Сначала мы просматриваем все выражение и находим оператор, имеющий наивысший приоритет. В нашем случае это *, поэтому сначала мы вычисляем b * c и, таким образом, снова выполняем ту же процедуру снова, пока не завершим вычисление выражения

Но это не так в случае постфиксного или инфиксного выражения. время, необходимое для вычисления постфиксного выражения, составляет O(n)

Преобразование инфиксов в постфикс ==== O(n) Оценка постфикса ==== O(n)

Общее время = O(n) + O(n)= O(n)

В случае вычисления постфикса нам не нужно думать о приоритете операторов. Просто нам нужно оценить слева, чтобы написать

Точно так же в случае префиксного выражения нам нужно оценивать справа налево

Другие вопросы по тегам