编写中缀转后缀算法时调用push函数出现错误求助
中缀转后缀表达式代码的错误修正
代码中的核心问题
- 缺少
isEmpty()和peek()方法:Python原生列表没有这两个方法,必须自行实现才能调用。 push函数冗余返回:列表append()方法无返回值,无需return。- 字符串操作错误:
postfix是字符串类型,不能使用列表的append()方法,需用+=进行拼接。 - 逻辑判断错误:类似
self.stack.peek() == '/' or '*'的写法逻辑混乱,实际会被解析为(self.stack.peek() == '/') or '*',永远为True,需改为明确的多条件判断。 - 循环条件逻辑颠倒:处理
)时,原条件self.stack.isEmpty() and ...完全错误,应该是栈不为空且栈顶不是'('。 - 遗漏弹出
(:处理)的循环结束后,未将栈顶的(弹出,会导致符号残留。 - 循环位置错误:清空栈的while循环被放在了for循环内部,导致每处理一个字符就清空栈,逻辑完全混乱,需移到for循环结束后。
- 无返回结果:
convert函数未返回postfix,调用后会得到None。 - 输入提示错误:提示文字写的是输入后缀表达式,实际应该输入中缀表达式。
修正后的代码
class Calculator: def __init__(self): self.stack = [] def pop(self): return self.stack.pop() def push(self, item): self.stack.append(item) def isEmpty(self): return len(self.stack) == 0 def peek(self): if not self.isEmpty(): return self.stack[-1] return None def convert(self, infix): self.stack.clear() postfix = '' for c in infix: if c == '(': self.push(c) elif c == ')': while not self.isEmpty() and self.peek() != '(': postfix += self.pop() if not self.isEmpty(): self.pop() elif c in '+-': while not self.isEmpty() and self.peek() in '*/+-': postfix += self.pop() self.push(c) elif c in '*/': while not self.isEmpty() and self.peek() in '*/': postfix += self.pop() self.push(c) else: postfix += c while not self.isEmpty(): postfix += self.pop() return postfix if __name__ == '__main__': cal = Calculator() infix_input = input('Please enter an infix expression: ') postfix = cal.convert(infix_input) print('Postfix expression:', postfix)
关键修正说明
- 新增
isEmpty()和peek()方法,分别通过列表长度判断和取最后一个元素实现栈的基础操作。 - 调整字符串拼接方式,用
+=替代错误的append()。 - 修正所有逻辑判断的写法,用
in简化多条件判断,避免逻辑歧义。 - 调整循环位置,确保所有字符处理完成后再清空栈内剩余运算符。
- 补充返回语句,让函数能输出转换后的后缀表达式。
内容的提问来源于stack exchange,提问作者Chris Bednar
相关产品推荐
相关产品推荐

