Python实现后序表达式计算(代码)

本文介绍了如何使用Python将中缀表达式通过栈转换为后缀(逆波兰)形式,并演示了后缀表达式的计算过程。通过`infix_to_postfix`函数处理 `(11+22)*(13+4)` 示例,展示了从括号处理到操作符优先级调度的方法。
摘要由CSDN通过智能技术生成

首先使用一个函数完成输入中序转后序
中序转后序前面的博客有写
Python使用栈将中序转后序(代码)

from pythonds.basic import Stack  # 引入栈


def infix_to_postfix(infix_expr):
    prec = {}
    prec["*"] = 3
    prec["/"] = 3
    prec["+"] = 2
    prec["-"] = 2
    prec["("] = 1
    op_stack = Stack()
    postfix_list = []

    # tokenList = infixexpr.split()
    token_list = list(infix_expr)
    numb = 0
    for token in token_list:
        if token in "0123456789":
            numb = numb * 10 + int(token)  # 这里针对多位数
        else:
            if numb != 0:
                postfix_list.append(numb)
                numb = 0
            if token == '(':

                op_stack.push(token)
            elif token == ')':
                top_token = op_stack.pop()
                while top_token != '(':
                    postfix_list.append(top_token)
                    top_token = op_stack.pop()
            else:
                while (not op_stack.isEmpty()) and (prec[op_stack.peek()] >= prec[token]):
                    postfix_list.append(op_stack.pop())
                op_stack.push(token)

    while not op_stack.isEmpty():
        postfix_list.append(op_stack.pop())
    return postfix_list
    # return " ".join(postfixList)


print(infix_to_postfix("(11+22)*(13+4)"))

然后使用后序进行计算


def postfix_evaluate(postfix_expr):  # 读进来要求是后序表达式
    operand_stack = Stack()  # 实例化栈(operand:操作数)

    for token in postfix_expr:
        if isinstance(token, int):
            # isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type()
            operand_stack.push(int(token))  # 是数字就入栈
        else:
            operand2 = operand_stack.pop()
            operand1 = operand_stack.pop()
            # 取出堆栈上面的两个数
            result = do_math(token, operand1, operand2)
            # 调用函数进行运算
            operand_stack.push(result)  # 将结果入栈

    return operand_stack.pop()  # 返回最终运算结束后栈的内容,即返回计算结果


def do_math(op, op1, op2):
    if op == "*":
        return op1 * op2
    elif op == "/":
        return op1 / op2
    elif op == "+":
        return op1 + op2
    else:
        return op1 - op2


print(postfix_evaluate(infix_to_postfix("(11+22)*(13+4)")))
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值