现在,这是我的代码:

precedence = {
    "+": 1,
    "-": 1,
    "*": 2,
    "/": 2,
    "": 0
}

def is_operator(token):
    ope = set(['+', '-', '*', '/'])
    return token in ope

def prefix_to_infix(expression):
    stack = []

    for pos, i in enumerate(expression):
        if is_operator(i):
            value1 = stack.pop()
            value2 = stack.pop()
            result = f"{value1}{i}{value2}"

            next_ope = check_next_operator(pos, expression)

            # Adds parenthesis if needed
            if compare_precedence(i, next_ope):
                result = f"{result}"             

            stack.append(result)
        else:
            stack.append(str(i))

    return result

def check_next_operator(pos, expression):
    i = pos + 1
    while i < len(expression):
        if is_operator(expression[i]):
            return expression[i]
        i += 1
    return ""

def compare_precedence(actual, next):
    if precedence[actual] <= precedence[next] and precedence[next] != 0:
        return True
    else:
        return False

但是,当我try 打印插入值+ / - 9 4 * 5 - 7 3 6时,(5 * (7 - 3))之间的圆括号丢失了.当然,这是因为-的优先级低于*. 此外,在- + - - - + 7 8 * / 5 4 2 6 * 7 2 3 0这样的情况下,它返回的括号比应有的多.

NOTE:我传递的表达式已经是反向的,这意味着它已经被转换为其后缀形式:['6', '3', '7', '-', '5', '*', '4', '9', '-', '/', '+']

我正在考虑一种方法,但我不确定它是否会奏效:

  • 如果下一个运算符的优先级更高:添加圆括号
  • 如果下一个运算符具有相同的优先级:如果它是不同的运算符,或者如果这个运算符不是可交换的,则只添加圆括号.
  • 如果下一个运算符的优先级较低:判断此表达式是否还有剩余的运算.如果有相同运算符的运算,则只在此运算符不同的情况下添加括号;如果是不同的运算符,则添加括号;如果此表达式没有剩余的运算,则不要添加括号.

推荐答案

@LoneneBula在This answer中发布了一个很好的算法,用最少数量的圆括号将后缀转换为中缀,跟踪用于生成每个复合操作数的最后一个操作符,如果其最后一个操作符的优先级低于当前操作符的优先级,则将括号添加到左操作数,并将参数添加到具有相同条件的右操作数,但也当右操作数的最后一个操作符的优先级低于当前操作符的优先级时,并且当前操作符是非通信操作符(即-/).

以下是该算法的一个实现:

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

def prefix_to_infix(expression):
    postfix = expression[::-1]
    stack = []
    for i in postfix:
        if i in precedence:
            value_left, operator_left = stack.pop()
            value_right, operator_right = stack.pop()
            if operator_left and precedence[operator_left] < precedence[i]:
                value_left = f'({value_left})'
            if operator_right and (
                precedence[operator_right] < precedence[i] or
                precedence[operator_right] == precedence[i] and
                i in noncommunicative
            ):
                value_right = f'({value_right})'
            stack.append((f'{value_left}{i}{value_right}', i))
        else:
            stack.append((i, None))
    return stack[0][0]

因此:

print(prefix_to_infix('+/-94*5-736'))
print(prefix_to_infix('-+---+78*/5426*7230'))

输出:

(9-4)/(5*(7-3))+6
7+8-5/4*2-6-7*2+3-0

演示:https://ideone.com/ACOnU3

Python相关问答推荐

七段显示不完整

将每个关键字值对转换为pyspark中的Intramame列

如何从. text中进行pip安装跳过无法访问的库

如何将自动创建的代码转换为类而不是字符串?

合并其中一个具有重叠范围的两个框架的最佳方法是什么?

如何计算部分聚合数据的统计数据

在Transformer中使用LabelEncoding的ML模型管道

绘制系列时如何反转轴?

KNN分类器中的GridSearchCV

Python:记录而不是在文件中写入询问在多文件项目中记录的最佳实践

具有症状的分段函数:如何仅针对某些输入值定义函数?

通过优化空间在Python中的饼图中添加标签

更改matplotlib彩色条的字体并勾选标签?

如果条件为真,则Groupby.mean()

将图像拖到另一个图像

用合并列替换现有列并重命名

使用密钥字典重新配置嵌套字典密钥名

根据列值添加时区

如何根据一列的值有条件地 Select 前N组?

Flash只从html表单中获取一个值