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

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

关键修改总结

  1. 必须先做分词,确保多位数、变量、运算符都是独立的token,避免拆分错误。
  2. 用列表存储所有前缀元素,最后通过' '.join()生成结果,保证所有元素间都有空格。

内容的提问来源于stack exchange,提问作者PCG Doris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 07:12:37