是否可以将所有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定位在正确的位置。我也不知道滚动操作是否对所有情况都足够。