如何使用 RPN 解析一元运算符?

问题描述 投票:0回答:2

给定中缀表达式

-190 + 20
,RPN 的正确结果会是什么样子?

-190 + 20 == -190 20 +

或者..

-190 + 20 == 190 - 20 +

一元运算符(负数)的规则是否与其他运算符相同,但只是一个

right
关联属性,并且优先级更高?

类似的表达式如下:

-(9 + 9)

会吗?

-(9 + 9) = 9 - 9 +

math postfix-notation unary-operator rpn
2个回答
5
投票

在典型的 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 首先没有这样的歧义性。


0
投票

一元减号应该没有问题。如果弹出减号后堆栈只有一个操作数,则它是一元的。一台在线 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!!!)
© www.soinside.com 2019 - 2024. All rights reserved.