给定中缀表达式
-190 + 20
,RPN 的正确结果会是什么样子?
-190 + 20 == -190 20 +
?
或者..
-190 + 20 == 190 - 20 +
?
一元运算符(负数)的规则是否与其他运算符相同,但只是一个
right
关联属性,并且优先级更高?
类似的表达式如下:
-(9 + 9)
会吗?
-(9 + 9) = 9 - 9 +
?
在典型的 RPN 语言中,您不能根据上下文将相同的标记
-
解释为一元或二元运算符,因为没有上下文。它必须始终是其中之一。因此,通常将 -
保留为二元减法运算符,并使用其他一些标记作为一元否定运算符。例如,Forth 称其为 NEGATE
。因此,在 Forth 中,您的 -190 + 20
可以编码为 190 NEGATE 20 +
,您的 -(9+9)
可以编码为 9 9 + NEGATE
。
Forth 还可以解析负数,因此您的
-190 + 20
也可以编码为 -190 20 +
。然而,在这种情况下,-
不是一个运算符,而只是单个标记-190
的一部分。此示例中使用的唯一运算符是 +
。
如果您用典型的 RPN 语言编写
190 - 20 +
,您将得到堆栈下溢(或者堆栈上发生的任何情况,负 190,加上 20),因为 -
无条件地解释为二元运算符。
RPN 没有优先级或关联性的概念 - 这些概念用于解决表达式求值中的歧义性,而 RPN 首先没有这样的歧义性。
一元减号应该没有问题。如果弹出减号后堆栈只有一个操作数,则它是一元的。一台在线 RPN 生成器免费生成 0,因此 -b 变为 0-b。但肯定的是
(-2)*(-3-5) should just be 2-3-5-+*.
and
-190 + 20 ==> 190-20+
-(9 + 9) ==> 9 9 + -
while
(-a)*((-b)-(-c)) ==> a- b- c- -* (that one may need checking!!!)