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

中缀转后缀表达式报错及结果缺失运算符问题求助

中缀转后缀表达式代码的问题分析与修复

核心问题点

  1. 操作数处理错误:原代码把操作数压入栈,正确逻辑是操作数直接加入postfix结果列表,而非栈结构。
  2. 运算符未入栈:处理加减乘除时,仅弹出栈内同级运算符,但未将当前运算符压入栈,导致运算符完全丢失。
  3. 右括号逻辑颠倒:原代码用if not self.stack:做判断,实际应循环弹出栈内元素直到遇到左括号,且最后要弹出左括号(不加入结果)。
  4. 优先级判断不全:未处理乘除优先级高于加减的情况,比如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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 19:12:47