为什么我们需要前缀,后缀表示法

时间:2011-09-26 23:21:39

标签: algorithm compiler-construction programming-languages formal-languages

我知道他们每个人如何相互转换,但从未真正理解他们的应用是什么。通常的中缀操作是可读的,但是哪里失败导致前缀和后缀表示法的开始

5 个答案:

答案 0 :(得分:41)

对于来说,中缀符号很容易阅读,而前/后缀符号更容易为机器解析。前/后符号的最大优点是不会出现像运算符优先级这样的问题。

例如,考虑中缀表达式1 # 2 $ 3。现在,我们不知道这些运算符的含义,因此有两种可能的对应后缀表达式:1 2 # 3 $1 2 3 $ #。在不知道管理这些运算符使用的规则的情况下,中缀表达式基本上没有价值。

或者,用更一般的术语来说:可以从前/后缀表达式恢复原始(解析)树而无需任何其他知识,但对于中缀表达式则不一样。

答案 1 :(得分:2)

后缀表示法,也称为RPN,从左到右很容易处理。操作数被压入堆栈;操作符从堆栈中弹出其操作数并推送结果。很少或不需要解析。它由Forth和一些计算器使用(HP计算器以使用RPN而着称)。

前缀表示法几乎易于处理;它在Lisp中使用。

答案 2 :(得分:1)

至少对于前缀表示法的情况:使用前缀运算符的优点是在语法上,它读取就好像运算符是函数调用

答案 3 :(得分:1)

前缀/后缀与中缀的另一个方面是运算符的arity(应用了多少个参数)不再必须限于2个。它可以更多,有时更少(0或1)当默认值自然隐含时,如加法/减法为零,一个用于乘法/除法。

答案 4 :(得分:0)

对于infix表达式,求值时间为O(n ^ 2) 原因是操作员优先。 例如:a + b * c 在这种情况下,我们不会直接评估a + b 首先,我们遍历整个表达式,并找到优先级最高的运算符。 在我们的例子中,它是*,因此首先我们计算b * c,然后再次遵循相同的过程,直到我们完成对表达式的求值

但是对于后缀或中缀表达式则不是这样。 后缀表达式的评估所需时间为O(n)

后缀转换的中缀==== O(n) 后缀评估==== O(n)

总时间= O(n)+ O(n)= O(n)

在后缀评估的情况下,我们不需要考虑运算符的优先级。 只是我们需要从左开始评估

类似地,对于前缀表达式,我们需要从右到左进行评估