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

使用自定义Stack类实现中缀转后缀表达式时代码运行异常求助

问题修复说明

核心错误点

  • Stack.pop()方法逻辑错误:空栈时执行弹出操作,非空时反而返回空打印,完全写反判断条件;且弹出元素后未更新栈顶top属性,导致后续栈顶判断全部失效。
  • Stack.pop()方法空栈分支无返回值,会导致后续列表拼接时出现非法None值。
  • 用Python内置关键字list作为变量名,存在命名冲突风险。

修正后的完整代码

class Stack:
    def __init__(self):
        self.stack=[]
        self.top = None

    def empty(self):
        return not self.stack

    def push(self, item):
        self.stack.append(item)
        self.top = item

    def pop(self):
        # 修正判断条件:非空栈才执行弹出
        if not self.empty():
            a = self.stack.pop()
            # 弹出后更新栈顶
            self.top = self.stack[-1] if not self.empty() else None
            return a
        else:
            print("Empty stack")
            return None
    
    def printall(self):
        print(self.stack)
    
    def clear(self):
        self.stack = []
        self.top = None

ysj = Stack()
jy = []

# 修改变量名,避免和内置list冲突
expr_list = input().split()
leng = len(expr_list)

num = 0

for i in range(0, leng):
    if expr_list[i] == '+' or expr_list[i] == '-':
        while ysj.top is not None:
            jy.append(ysj.pop())
            num = num - 1
        ysj.push(expr_list[i])
        num = num + 1

    elif expr_list[i] == '/' or expr_list[i] == '*':
        while ysj.top == '/' or ysj.top == '*':
            jy.append(ysj.pop())
            num = num - 1
        ysj.push(expr_list[i])
        num = num + 1

    else:
        jy.append(int(expr_list[i]))

for i in range(1, num + 1):
    jy.append(ysj.pop())

for i in range(0, len(jy)):
    print(jy[i], end=" ")

验证结果

修正后所有测试用例输出均符合后缀表达式规则:

  • 输入1 * 2 + 3 → 输出1 2 * 3 +
  • 输入1 * 2 * 3 → 输出1 2 * 3 *
  • 输入1 + 2 + 3 → 输出1 2 + 3 +

内容的提问来源于stack exchange,提问作者김규민

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 12:24:01