使用堆栈将中缀表达式转换为前缀时,如果扫描和堆栈顶部的运算符具有相同的优先级,应该怎么做?

Posted

技术标签:

【中文标题】使用堆栈将中缀表达式转换为前缀时,如果扫描和堆栈顶部的运算符具有相同的优先级,应该怎么做?【英文标题】:When converting an infix expression to prefix using stacks, if the scanned and top of the stack operators have same precedence, what should be done? 【发布时间】:2016-09-21 14:36:47 【问题描述】:

这个问题是在单选 MCQ 测试中提出的。扫描中缀表达式转换为前缀时,如果扫描的运算符和栈顶运算符的优先级相同,应该怎么做?

最有意义的两个选项是:

    只需将传入的运算符压入堆栈即可。 将当前运算符弹出堆栈顶部并将其添加到转换后的表达式中,然后再次将传入的运算符压入堆栈。

教练告诉的答案是选项1。但是我的答案是选项2。两种思路都会产生不同的结果:

假设我们有一个中缀表达式 a * b * c。如果我们使用方法 1,它会产生前缀表达式 **abc。如果我们选择选项 2,它会产生结果 * a * bc。

那么正确答案是什么?

(这是我用来回答这个问题的算法:http://scanftree.com/Data_Structure/infix-to-prefix 混淆之处在于涉及相同优先级的运算符。)

【问题讨论】:

仅仅因为它们是一元运算符,它们不需要(也没有)相同的优先级。 更正了。我参考的教科书提到它们确实具有相同的优先顺序(++ 和 * 以及 &),因此评估是从右到左进行的..我错过了什么吗? 它并没有说出全部真相。无论如何,*p++++*p 甚至*++p 具有截然不同的语义。你可能想要一本更好的教科书。 好的。我将删除该示例。但我认为即使没有这个例子,问题仍然存在? 【参考方案1】:

这取决于运算符的关联性。一些运算符是左结合的。例如,2-3-4 应解释为 (2-3)-4,而不是 2-(3-4)。其他运算符是右结合的。例如,在 C 中,x=y=z 应该解释为 x=(y=z),而不是 (x=y)=z。

【讨论】:

这是有道理的。那么,通过仍然牢记关联性来转换为前缀的正确方法是什么? @PriyankarKumar 您已经列举了两个可能的答案。对左结合运算符使用答案 1,对右结合运算符使用答案 2。

以上是关于使用堆栈将中缀表达式转换为前缀时,如果扫描和堆栈顶部的运算符具有相同的优先级,应该怎么做?的主要内容,如果未能解决你的问题,请参考以下文章

逆波兰表达式

7-21 求前缀表达式的值(25 分)

堆栈入门-简单计算器模板-中缀转后缀

前缀,中缀,后缀表达式

前缀,中缀,后缀表达式

Qz学算法-数据结构篇(表达式递归)