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

时间:2020-03-05 18:46:19  来源:igfitidea点击:

我已经说服自己,他们做不到。

举个例子:

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

如果我们有能力交换堆栈中的项目,则可以,否则,可以。

有什么想法吗?

解决方案

回答

展示一个不能告诉你答案的东西就足够了。

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

2 4 + 7 8 + *

无论我们如何重新排序,最终都需要进行一些总结。

至少我相信。

回答

实际上,通过研究一个足以证明标题中隐含假设的反例,我们不仅给出了答案,而且还提供了确凿的证据。

回答

考虑代数表达式:

(a + b) * (c + d)

RPN的明显翻译是:

a b + c d + *

即使有可用的交换操作,我也不认为有一种方法可以收集右侧的所有运算符:

a b c d +
a b S

其中S是c和d之和。在这一点上,我们不能使用单个交换操作来使a和b都适合+操作。取而代之的是,我们将需要更复杂的堆栈操作(例如roll),以使a和b定位在正确的位置。我也不知道滚动操作是否对所有情况都足够。