中缀转后缀表达式报错及结果缺失运算符问题求助
中缀转后缀表达式代码的问题分析与修复
核心问题点
- 操作数处理错误:原代码把操作数压入栈,正确逻辑是操作数直接加入
postfix结果列表,而非栈结构。 - 运算符未入栈:处理加减乘除时,仅弹出栈内同级运算符,但未将当前运算符压入栈,导致运算符完全丢失。
- 右括号逻辑颠倒:原代码用
if not self.stack:做判断,实际应循环弹出栈内元素直到遇到左括号,且最后要弹出左括号(不加入结果)。 - 优先级判断不全:未处理乘除优先级高于加减的情况,比如
1+2*3这类表达式无法正确转换。
修正后的代码
class Calculator: def __init__(self): self.stack = [] def _get_priority(self, op): # 定义运算符优先级:乘除高于加减,括号最低 if op in ('+', '-'): return 1 if op in ('*', '/'): return 2 return 0 # 括号优先级设为0 def convert(self, infix): self.stack.clear() postfix = [] for c in infix: if c == '(': self.stack.append(c) elif c == ')': # 弹出栈内元素直到遇到左括号 while self.stack and self.stack[-1] != '(': postfix.append(self.stack.pop()) # 弹出左括号,不加入结果 if self.stack: self.stack.pop() elif c in ('+', '-', '*', '/'): # 弹出栈内优先级不低于当前运算符的元素 while self.stack and self._get_priority(self.stack[-1]) >= self._get_priority(c): postfix.append(self.stack.pop()) # 将当前运算符压入栈 self.stack.append(c) else: # 操作数直接加入结果列表 postfix.append(c) # 弹出栈内剩余所有运算符 while self.stack: postfix.append(self.stack.pop()) return postfix
关键修改说明
- 新增
_get_priority方法统一管理运算符优先级,避免重复判断。 - 操作数直接追加到
postfix,不再入栈。 - 处理运算符时,先弹出栈内优先级更高或相等的运算符,再将当前运算符入栈。
- 右括号处理逻辑修正:循环弹出直到左括号,最后移除左括号。
测试输入1+2,会得到正确结果['1', '2', '+'];输入1+2*3,结果为['1', '2', '3', '*', '+']。
内容的提问来源于stack exchange,提问作者Chris Bednar
相关产品推荐
相关产品推荐

