python 用最少的括号将前缀转换为中缀

1hdlvixo  于 2023-11-15  发布在  Python
关注(0)|答案(1)|浏览(98)

下面是我的代码:

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

字符串
然而,当我尝试打印+ / - 9 4 * 5 - 7 3 6的中缀值时,(5 * (7 - 3))之间的括号不见了。当然,这是因为-的优先级低于*。此外,在- + - - - + 7 8 * / 5 4 2 6 * 7 2 3 0这样的情况下,它返回的括号比应有的多。

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

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

  • 如果下一个运算符具有更高的优先级:添加括号
  • 如果下一个运算符具有相同的优先级:仅当它是不同的运算符或该运算符不是可交换的时才添加括号。
  • 如果下一个运算符的优先级较低:检查此表达式是否还有剩余运算符。如果有相同运算符的剩余运算符,则仅在此运算符不是可交换的情况下添加括号;如果是不同运算符,则添加括号;如果此表达式没有剩余运算符,则不添加括号。
6kkfgxo0

6kkfgxo01#

@Lonenebula在这个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

相关问题