中缀转后缀算法异常:运算符输出顺序不符合预期
中缀转后缀表达式:减法与取模运算符顺序错误问题分析
问题核心
你的测试表达式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
相关产品推荐
相关产品推荐

