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

中缀转后缀算法异常:运算符输出顺序不符合预期

中缀转后缀表达式:减法与取模运算符顺序错误问题分析

问题核心

你的测试表达式2 + 3 * 4 - 10 / 5 % 3的运算逻辑遵循以下规则:

  • 乘法*、除法/、取模%优先级相同,且高于加法+、减法-
  • 所有运算符均为左结合(即同一优先级的运算符从左到右计算)

预期后缀表达式的逻辑是:先完成10/5%3的计算,再用前面2+3*4的结果减去该值,因此最终的-应该在%之后。而你的代码输出中-提前出现,说明在处理%运算符时,错误地将栈顶的-弹出到结果中了。

常见错误点及排查方案

1. 运算符优先级定义错误

检查你的优先级映射表,必须确保%的优先级与*、/一致,且高于+、-。例如正确的优先级定义(以Python为例):

precedence = {
    '+': 1,
    '-': 1,
    '*': 2,
    '/': 2,
    '%': 2
}

如果错误地将%的优先级设为1(与+、-同级),或者将-的优先级设为2,都会导致栈顶的-被提前弹出。

2. 栈弹出逻辑错误

处理运算符入栈时,左结合运算符的弹出规则是:循环弹出栈顶运算符到结果,直到栈为空、栈顶是左括号,或者栈顶运算符的优先级低于当前运算符。

错误的逻辑通常是:当栈顶运算符优先级大于等于当前运算符时弹出,但如果你的优先级定义正确,%的优先级(2)高于-(1),此时precedence[stack[-1]] >= precedence[op]的结果为False,不会弹出-,而是直接将%入栈。

如果你的代码中错误地写反了优先级比较(比如判断precedence[op] >= precedence[stack[-1]]时弹出),就会导致%入栈前错误弹出-。

修正示例代码片段

以下是正确的运算符入栈处理逻辑(Python):

def infix_to_postfix(tokens):
    precedence = {'+':1, '-':1, '*':2, '/':2, '%':2}
    stack = []
    postfix = []
    for token in tokens:
        if token.isdigit():
            postfix.append(token)
        elif token == '(':
            stack.append(token)
        elif token == ')':
            while stack and stack[-1] != '(':
                postfix.append(stack.pop())
            stack.pop()  # 弹出左括号
        else:  # 处理运算符
            # 左结合:栈顶优先级 >= 当前优先级时弹出
            while stack and stack[-1] != '(' and precedence[stack[-1]] >= precedence[token]:
                postfix.append(stack.pop())
            stack.append(token)
    # 弹出栈中剩余运算符
    while stack:
        postfix.append(stack.pop())
    return ' '.join(postfix)

用这个逻辑处理你的测试用例,会得到预期的2 3 4 * + 10 5 / 3 % -。

内容的提问来源于stack exchange,提问作者Jared Davis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 16:55:12