是否可以表示所有RPN表达式,使所有运算符出现在左侧,所有操作数出现在右侧?

时间:2008-09-02 09:01:50

标签: rpn

我确信自己不能。

以例如:

4 4 + 4 /

堆栈:4 堆栈:4 4  4 + 4 = 8 堆栈:8 堆栈:8 4  8/4 = 2 堆栈:2

有两种方法可以用上面的表达式来编写 操作数和操作数相同,操作数都是第一位的:“4 4 4 + /“和”4 4 4 / +“,两者都不是2。

“4 4 4 + /” 堆栈:4 堆栈:4 4 堆栈:4 4 4  4 + 4 = 8 堆栈:4 8  4/8 = 0.5 堆栈:0.5

“4 4 4 / +” 堆栈:4 堆栈:4 4 堆栈:4 4 4  4/4 = 1 堆栈:4 1  4 + 1 = 5 堆栈:5

如果你有能力交换堆栈上的项目,那么是的,这是可能的,否则,没有。

思想?

4 个答案:

答案 0 :(得分:2)

考虑代数表达式:

(a + b) * (c + d)

对RPN的明显转换是:

a b + c d + *

即使有可用的交换操作,我也认为没有办法收集右边的所有运营商:

a b c d +
a b S

其中S是c和d的总和。此时,您无法使用单个交换操作来为a +操作同时获取a和b。相反,您需要更复杂的堆栈操作(例如滚动)才能在正确的位置获得a和b。我不知道滚动操作是否足以满足所有情况。

答案 1 :(得分:1)

实际上,你不仅给出了答案,而且给出了一个确凿的证据,通过检验一个足以反驳标题中隐含的假设的反例。

答案 2 :(得分:1)

我知道这是一个非常古老的主题,但我今天才发现它,并想说我相信原问题的答案是肯定的。我相信所有RPN表达式都可以表示为所有运算符出现在左侧,所有操作数出现在右侧,如果除了正常的算术运算之外,我们还可以在表示中包含三个额外的“导航”运算符。 / p>

任何算术表达式都可以表示为二叉树,叶子节点上有变量和常量,树中叉子的二进制算术运算,以及沿任何分支的一元操作,如否定,倒数或平方根。我建议的三个附加操作表示构建左分支,构建右分支或到达二叉树中的叶节点。现在,如果我们根据树中各自叶子的位置将所有操作数放在输入字符串的左侧,我们可以为输入字符串的其余部分提供操作,告诉如何在内存中重建适当的二叉树并插入操作数和数学运算在正确的点上。最后,应用深度优先树遍历算法来计算结果。

我不知道这是否有任何实际应用。编码和解码表达式的方式可能效率太低。但作为一项学术活动,我相信它是可行的。

答案 3 :(得分:0)

足以显示一个不能告诉你答案的人。

如果无法重新排序堆栈内容,则无法重新排列表达式(2 + 4)*(7 + 8)。

2 4 + 7 8 + *

无论你如何重新排序,你都会在继续之前得到一些需要总结的东西。

至少我相信。