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

44

我知道它们之间如何相互转换,但从未真正理解它们的应用。通常的中缀操作非常易读,但是它在哪些方面失败了,导致了前缀和后缀表示法的出现呢?


1
sin(x) 是前缀。 -x 是前缀。 前缀通常与中缀一起使用。 除了“您已经在使用它”,还需要了解更多吗? - S.Lott
4
或许中缀表达式之所以易读,只是因为我们已经习惯了它! - Peter Recore
1
我觉得如果我们习惯于使用前缀表示法,那么它会更加直观。在计算机编程中,前缀表示法很容易实现,但后缀表示法占用的内存较少。中缀表示法在任何方面都是最糟糕的,无论是对人类(依我之见)还是计算机来说。 - Mooing Duck
我建议您阅读此链接http://itviewson.files.wordpress.com/2012/06/infixprefixpostfix.pdf中有关这些符号的内容。它将消除您所有的困惑。 - Nomiluks
1
@MooingDuck 如果从右到左进行评估,前缀与后缀相同。如果从左到右进行评估,则前缀比后缀更快,因为它支持布尔运算的短路优化。 - KRoy
显示剩余3条评论
4个回答

66

中缀表示法对于人类来说易于阅读,而前/后缀表示法则更容易被机器解析。前/后缀表示法的重要优点是不会出现任何像操作符优先级这样的问题。

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

或者换句话说:可以从前/后缀表达式中恢复原始(解析)树,而不需要任何额外的知识,但对于中缀表达式来说则不成立。


2
前缀和后缀表达式仍需要知道每个运算符需要多少操作数。没有这个知识就不能解析它们。Lisp通过在每个子表达式中加括号来解决这个问题。1 2 # 3 $ 可以等价于 $ (# 1 2) 3) 或者 $ 1 (# 2) 3) - John Kugelman

6
后缀表达式,也被称为RPN,非常容易从左到右处理。操作数被推入堆栈;运算符从堆栈中弹出其操作数并将结果推送到堆栈中。几乎不需要解析。它被Forth和一些计算器(HP计算器以使用RPN而闻名)使用。
前缀表达式几乎同样容易处理;它在Lisp中使用。

不,Lisp不使用前缀表示法。在Lisp中,所有内容都是用括号括起来的。 - Derek Ledbetter
4
是的,所有内容都用括号括起来,但括号中间的内容使用前缀表示法:“(+ 2 2)”。这不是纯粹的前缀表示法。 - Keith Thompson
1
8年后:括号使得在不知道函数期望的参数数量的情况下,可以指定传递给函数的参数数量。 - Keith Thompson

2

至少对于前缀表示法而言:使用前缀运算符的优点在于,在语法上,它读起来就像是一个函数调用。


1
另一个前缀/后缀与中缀的不同之处在于运算符的元数(应用于多少个参数)不再必须限制为恰好2个。它可以是更多,或者有时会更少(当默认值被自然地暗示时,例如加法/减法的零,乘法/除法的一)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接