Python中中缀转前缀表达式的格式问题修正求助
问题分析与修改方案
你的问题出在两个核心点:多位数被拆分为单个数字字符、运算符与后续操作数之间缺少空格,以下是针对性的修改步骤:
1. 修复多位数识别问题(分词阶段)
你当前的代码应该是逐个字符处理输入,导致连续数字(如81、21)被拆成独立的单个数字。必须先对输入做分词处理,把连续数字、单个变量、运算符、括号拆成独立的token。
示例分词函数:
def tokenize(expr): tokens = [] i = 0 n = len(expr) while i < n: c = expr[i] if c.isspace(): i += 1 continue # 合并连续数字为单个token if c.isdigit(): num_str = c i += 1 while i < n and expr[i].isdigit(): num_str += expr[i] i += 1 tokens.append(num_str) # 单个字母变量直接作为token elif c.isalpha(): tokens.append(c) i += 1 # 运算符、括号单独作为token else: tokens.append(c) i += 1 return tokens
2. 修复前缀表达式的空格格式问题
生成前缀表达式时,不能直接拼接字符串,要确保每个元素(运算符、操作数)之间用空格分隔。推荐用列表存储所有token,最后用' '.join()生成结果,避免手动拼接时漏加空格。
假设你用「反转中缀→转后缀→反转得前缀」的常见逻辑,修改后的核心代码示例:
def infix_to_prefix(expr): tokens = tokenize(expr) # 反转中缀表达式,同时替换括号(左变右、右变左) reversed_tokens = [] for t in reversed(tokens): if t == '(': reversed_tokens.append(')') elif t == ')': reversed_tokens.append('(') else: reversed_tokens.append(t) # 运算符优先级定义 precedence = {'+':1, '-':1, '*':2, '/':2} stack = [] postfix = [] # 反转后的中缀转后缀 for token in reversed_tokens: if token.isalnum(): 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()) # 反转后缀得到前缀,并用空格连接所有token prefix = postfix[::-1] return ' '.join(prefix)
测试验证
- 输入
(9-81)*(2+21),返回*-9 81 + 2 21 - 输入
(A-8)*(34+21),返回*-A 8 + 34 21
关键修改总结
- 必须先做分词,确保多位数、变量、运算符都是独立的token,避免拆分错误。
- 用列表存储所有前缀元素,最后通过
' '.join()生成结果,保证所有元素间都有空格。
内容的提问来源于stack exchange,提问作者PCG Doris
相关产品推荐
相关产品推荐

