为什么需要前缀,后缀符号

问题描述 投票:28回答:5

我知道他们每个人都可以相互转换,但从未真正了解他们的应用程序是什么。常用的infix操作可读性强,但是在哪里失败,导致前缀和后缀表示法的出现

algorithm compiler-construction programming-languages formal-languages
5个回答
45
投票

Infix表示法对于humans来说很容易理解,而前缀/后缀表示法对于机器来说更容易解析。前缀/后缀表示法的最大优势在于,永远不会出现像运算符优先级之类的问题。

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

或者,更笼统地说:可以从前/后缀表达式中恢复原始(解析)树,而无需任何其他知识,但对于中缀表达式而言并非如此。


3
投票

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

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


1
投票

至少在前缀表示法的情况下:使用前缀运算符的好处是,从语法上看,它读起来好像该运算符是函数调用一样


1
投票

前缀/后缀与infix的另一方面是,运算符的Arity(应用了多少个参数)不再必须精确地限制为2。它可以更大或更小(当为0或1时,默认是默认值,例如加/减为零,乘/除为1。


0
投票

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

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

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

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

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

同样,对于前缀表达式,我们需要从右到左求值

© www.soinside.com 2019 - 2024. All rights reserved.