我已经说服自己,他们不能。
举个例子:
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=8堆栈:4 8 4/8= 0.5堆栈: 0.5
"4 4 4/ +“堆栈:4堆栈:4 4堆栈:4 4 4/4=1堆栈:4 1 4+1=5堆栈:5
如果你有能力在堆栈上交换项目,那么是的,这是可能的,否则,不是。
有什么想法?
发布于 2008-09-02 09:08:09
考虑一下代数表达式:
(a + b) * (c + d)到RPN的显而易见的翻译是:
a b + c d + *即使交换操作可用,我也不认为有一种方法可以收集右侧的所有运算符:
a b c d +
a b S其中S是c和d的总和。在这一点上,您不能使用单个交换操作将a和b都放在a+操作的适当位置。相反,您需要更复杂的堆栈操作(如roll)才能将a和b放在正确的位置。我也不知道滚动操作是否对所有情况都足够。
发布于 2008-09-02 09:06:26
实际上,你不仅给出了答案,而且还通过检查一个足以反驳标题中隐含的假设的反例,给出了一个确凿的证据。
发布于 2012-12-13 12:27:28
我知道这是一个非常古老的帖子,但我今天才找到它,我想说我相信原始问题的答案是肯定的。我相信所有RPN表达式都可以表示为所有运算符都显示在左边,所有操作数都显示在右边,如果除了正常的算术运算之外,我们还可以在表示中包括三个额外的“导航”运算符。
任何算术表达式都可以表示为二叉树,在叶节点具有变量和常量,在树中的分支具有二进制算术运算,以及沿任何分支的一元运算,如求反、倒数或平方根。我建议的三个额外操作代表构建左分支、构建右分支或到达二叉树中的叶节点。现在,如果我们根据它们各自的叶子在树中的位置将所有操作数放在输入字符串的左侧,我们可以为输入字符串的其余部分提供操作,告诉如何在内存中重建适当的二叉树,并在正确的点处将操作数和数学操作插入其中。最后采用深度优先的树遍历算法对结果进行计算。
我不知道这是否有任何实际应用。作为编码和解码表达式的方式,它的效率可能太低了。但作为一项学术练习,我相信这是可行的。
https://stackoverflow.com/questions/39061
复制相似问题