python 中缀转后缀 计算后缀表达式

def is_op(c):
    return c in "+-*/"
def get_pri(c):
    assert is_op(c)
    p = {
        "+":1,
        "-":1,
        "/":2,
        "*":2,
    }
    return p[c]

string = "1+(2*3)/2+3"

# 中缀表达式转后缀表达式
def convert(string):
    output = ""
    stack = []
    for c in string:
        # 如果是运算符
        if is_op(c):
            # 栈非空 && 上一个是操作符 && 优先级大于【等于】当前操作符
            while stack and is_op(stack[-1]) and get_pri(stack[-1]) >= get_pri(c):
                # 上一个操作符出栈
                output += stack.pop()
            # 当前运算符入栈
            stack.append(c)
        # 如果是左括号
        elif c == "(":
            # 入栈
            stack.append(c)
        # 如果是右括号
        elif c == ")":
            # 栈非空时
            while stack:
                # 上一个操作符出栈
                # 上一个是括号退出循环
                top = stack.pop()
                if top == "(":
                    break
                output += top

        else:
            output += c

    # 弹出剩余操作符
    while stack:
        output += stack.pop()
    return output

# 计算后缀表达式
def calculate(string):
    stack = []
    for c in string:
        # 如果是运算符
        if is_op(c):
            # [右面的操作数先出栈]
            b = stack.pop()
            a = stack.pop()
            stack.append(eval(f"{a}{c}{b}"))
        else:
            # 操作数直接入栈
            stack.append(c)

    # [最后一个必是操作数]
    return stack.pop()

cs = convert(string)
print(cs)
result = calculate(cs)
print(result)

posted @ 2021-07-23 21:08  aminor  阅读(377)  评论(0)    收藏  举报
/**/ /**/