You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写中缀转后缀算法时调用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)

关键修正说明

  1. 新增isEmpty()和peek()方法,分别通过列表长度判断和取最后一个元素实现栈的基础操作。
  2. 调整字符串拼接方式,用+=替代错误的append()。
  3. 修正所有逻辑判断的写法,用in简化多条件判断,避免逻辑歧义。
  4. 调整循环位置,确保所有字符处理完成后再清空栈内剩余运算符。
  5. 补充返回语句,让函数能输出转换后的后缀表达式。

内容的提问来源于stack exchange,提问作者Chris Bednar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 18:53:17