Python生成后缀表达式及计算

1. 什么是后缀表达式

后缀表达式(也叫做逆波兰式或逆波兰记法),其实就是将运算符写在操作数之后的式子。比如我们平时写a+b,这是中缀表达式,写成后缀表达式就是ab+。下面来看一个更复杂的例子:
(a+b)*c-(a+b)/e后缀表达式的j具体过程:

(a+b)*c-(a+b)/e
→ ((a+b)*c)((a+b)/e)-
→ ((a+b)c*)((a+b)e/)-
→ (ab+c*)(ab+e/)-
→ ab+c*ab+e/-

2. 生成后缀表达式

生成后缀表达式主要借助了**这一数据结构,具体的实现代码如下,其中输入的是中缀表达式的字符串,然后返回后缀表达式**的字符串。

    def generate_postfix(infix):
        """
        generate postfix expression str
        :param infix: infix expression str, like '2x3+8/3'
        :return: postfix expression str, like '23x83/+'
        """
        op_rank = {'x': 2, '/': 2, '+': 1, '-': 1}  # 定义加减乘除的优先级
        stack = []  # 用list模拟栈的后进先出
        post_list = []
        for s in infix:
            if s in '+-x/':  # operator
                # 栈不为空,且栈顶运算符的优先级高于当前运算符
                while stack and op_rank.get(stack[-1]) >= op_rank.get(s):  # priority
                    post_list.append(stack.pop())
                stack.append(s)
            else:  # operand
                post_list.append(s)
        while stack:
            post_list.append(stack.pop())
        return ''.join(post_list)

3. 计算后缀表达式

后缀表达式的计算同样需要使用到**,具体的实现代码如下,其中输入的是后缀表达式字符串,然后返回该表达式int类型的计算结果**。

    def calculate_postfix(postfix):
        """
        calculate postfix expression
        :param postfix: postfix expression str, like '23x83/+'
        :return: int result, like 2x3+8/3=6+2=8
        """
        stack = []  # 用list模拟栈的后进先出
        for p in postfix:
            if p in '+-x/':  # operator
                value_2 = int(stack.pop())  # 第二个操作数
                value_1 = int(stack.pop())  # 第一个操作数
                if p == '+':
                    result = value_1 + value_2
                elif p == '-':
                    result = value_1 - value_2
                elif p == 'x':
                    result = value_1 * value_2
                else:   # 整除
                    result = value_1 // value_2
                stack.append(result)
            else:
                stack.append(p)
        return stack.pop()
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值