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()

你可能感兴趣的:(算法)