我知道他们每个人都可以相互转换,但从未真正了解他们的应用程序是什么。常用的infix操作可读性强,但是在哪里失败,导致前缀和后缀表示法的出现
Infix表示法对于humans来说很容易理解,而前缀/后缀表示法对于机器来说更容易解析。前缀/后缀表示法的最大优势在于,永远不会出现像运算符优先级之类的问题。
例如,考虑中缀表达式1 # 2 $ 3
。现在,我们不知道这些运算符的含义,因此有两个可能的对应后缀表达式:1 2 # 3 $
和1 2 3 $ #
。在不知道控制这些运算符使用的规则的情况下,中缀表达式本质上是毫无价值的。
或者,更笼统地说:可以从前/后缀表达式中恢复原始(解析)树,而无需任何其他知识,但对于中缀表达式而言并非如此。
后缀表示法,也称为RPN,从左到右很容易处理。操作数被压入堆栈;运算符从堆栈中弹出其操作数并推入结果。几乎不需要解析。它由Forth和某些计算器使用(HP计算器因使用RPN而被注明)。
前缀表示法几乎一样容易处理;它在Lisp中使用。
至少在前缀表示法的情况下:使用前缀运算符的好处是,从语法上看,它读起来好像该运算符是函数调用一样
前缀/后缀与infix的另一方面是,运算符的Arity(应用了多少个参数)不再必须精确地限制为2。它可以更大或更小(当为0或1时,默认是默认值,例如加/减为零,乘/除为1。
在使用infix表达式的情况下,评估所需的时间为O(n ^ 2)原因是操作员优先。例如:a + b * c在这种情况下,我们不会直接评估a + b首先,我们遍历整个表达式,并找到优先级最高的运算符。在我们的例子中,它是*,因此首先我们评估b * c,然后再次遵循相同的过程,直到我们完成对表达式的评估]
但是对于后缀或中缀表达式则不是这样。后缀表达式评估所需的时间为O(n)
后缀到后缀的转换==== O(n)后缀评估==== O(n)
总时间= O(n)+ O(n)= O(n)
在后缀评估的情况下,我们不需要考虑运算符的优先级。只是我们需要从左开始评估就可以了
同样,对于前缀表达式,我们需要从右到左求值