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()
  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
关于 Python 中的 `self` 关键字: 在 Python 中,`self` 是一个约定俗成的关键字,通常作为类方法的第一个参数出现。它表示类的实例对象本身,可以用来访问实例变量和方法。在 Python 中,不像其他语言中使用 `this` 或 `self` 关键字一样强制要求使用,但是为了代码的可读性和规范性,建议在类方法中使用 `self`。 关于 Python 实现中序遍历表达式二叉树,前缀、中缀、后缀表达式生成表达式二叉树: 以下是一个示例代码,实现了中序遍历表达式二叉树,前缀、中缀、后缀表达式生成表达式二叉树的功能: ```python class TreeNode: def __init__(self, val): self.val = val self.left = None self.right = None class ExpressionTree: def __init__(self): self.root = None # 中序遍历表达式二叉树 def inorder_traversal(self, node): if node.left: self.inorder_traversal(node.left) print(node.val, end=' ') if node.right: self.inorder_traversal(node.right) # 前缀表达式生成表达式二叉树 def build_from_prefix(self, expression): stack = [] for i in range(len(expression) - 1, -1, -1): if expression[i].isdigit(): node = TreeNode(expression[i]) stack.append(node) else: node = TreeNode(expression[i]) node.left = stack.pop() node.right = stack.pop() stack.append(node) self.root = stack.pop() # 中缀表达式生成表达式二叉树 def build_from_infix(self, expression): stack = [] i = 0 while i < len(expression): if expression[i].isdigit(): j = i while j < len(expression) and expression[j].isdigit(): j += 1 node = TreeNode(expression[i:j]) stack.append(node) i = j elif expression[i] == '(': stack.append('(') i += 1 elif expression[i] == ')': while stack[-1] != '(': right = stack.pop() op = stack.pop() left = stack.pop() node = TreeNode(op) node.left = left node.right = right stack.append(node) stack.pop() # 弹出左括号 i += 1 else: while stack and stack[-1] != '(' and self.precedence(stack[-1]) >= self.precedence(expression[i]): right = stack.pop() op = stack.pop() left = stack.pop() node = TreeNode(op) node.left = left node.right = right stack.append(node) stack.append(expression[i]) i += 1 while len(stack) > 1: right = stack.pop() op = stack.pop() left = stack.pop() node = TreeNode(op) node.left = left node.right = right stack.append(node) self.root = stack.pop() # 后缀表达式生成表达式二叉树 def build_from_postfix(self, expression): stack = [] for c in expression: if c.isdigit(): node = TreeNode(c) stack.append(node) else: right = stack.pop() left = stack.pop() node = TreeNode(c) node.left = left node.right = right stack.append(node) self.root = stack.pop() # 返回操作符优先级 def precedence(self, op): if op == '+' or op == '-': return 1 elif op == '*' or op == '/': return 2 else: return 0 ``` 其中,`TreeNode` 表示二叉树的节点,`ExpressionTree` 表示表达式二叉树。`build_from_prefix`、`build_from_infix`、`build_from_postfix` 分别表示通过前缀、中缀、后缀表达式生成表达式二叉树的方法。`inorder_traversal` 表示中序遍历表达式二叉树的方法。`precedence` 表示返回操作符优先级的方法。 示例代码中使用了栈来辅助实现表达式树的构建,具体的实现方法可以参考代码中的注释。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值