python 栈-解析四则运算公式

python 栈-解析四则运算公式

1、栈

也被称为下堆栈, 他是有序集合, 添加操作和移除操作发生在同一端,即顶端, 另一端称为底端

  • LIFO(last-in, first-out) 后进先出
  • 可用于反转排列顺序

栈的抽象数据类型

支持以下操作

  • push(item) 将元素添加到栈中
  • pop() 返回并删除顶端的元素
  • peek() 返回顶端的元素, 但不删除元素
  • isEmpty() 判断栈是否为空
  • size() 返回栈中的元素数量

解析算数表达式

  • 括号匹配: 每一个左括号都有与之对应的又括号, 并且括号有正确的嵌套关系

处理括号匹配
由空栈开始,从左往右依次处理括号。遇到左括号, 使用push操作将其加入栈中;如果遇到右括号就调用pop操作, 所有的左括号都应有右括号与之匹配。
处理完括号匹配,栈应该是空的

  • 前序表达式:运算符调整到两个操作数前, eg: +ab

  • 中序表达式:运算符出现在两个操作数间, eg: a*b

  • 后序表达式:运算符调整至操作数后, eg: ab+

  • 完全括号表达式: 对每一对运算符都添加一对括号, 由括号决定运算顺序, 杜绝歧义, 并且不需要记忆运算规则

    中序表达式 前序表达式 后序表达式
    a + b + a b a b +
    a - b / c - a / b c a b c / -
    a + b * c + d + a * b c + d a b c * + d +
    (a + b) * ( c + d) * + a b + c d a b + c d + *

中序转后序

  • 创建一个空栈和列表, 分别保存运算符和转换结果列表
  • 将中序表达式转换为一个列表
  • 从左往右扫描列表
    • 数值, 添加至转换列表中
    • 左括号, 压入栈中
    • 右括号, 重复从栈中获取元素,添加至转换结果列表中, 直至获取左括号
    • 运算符,将其与栈中的顶端元素比较,从栈中取出优先级高的元素追加至转换列表中
  • 处理完表达式后将栈中残余的运算符追加至转换结果列表中

后序表达式计算

  • 创建空栈
  • 将后续表达式转化为一个列表
  • 从左往右扫描列表
    • 数值,压入栈中
    • 运算符,从栈中去两个元素, 第一个为右数, 第二个为左数,计算出数值后重新压入栈中
  • 处理完表达式后, 从栈中获取数值

2、解析四则运算-Coding

后序表达式计算

# -*- coding: utf-8 -*-

"""
中序表达式转后序表达式, 并计算
"""
import re
import operator
import string


class PostOrderConversion:

    def conversionToPostOrder(self, inOrdErexpr):
        """
        后序转换
        """
        # 构建运算符优先级字典
        prec = {
   
            "*": 3,
            "/": 3,
            "+": 2,
            "-": 2,
            "(": 1,
            ")": 1
        }

        if not self.parseChecker(inOrdErexpr):
            raise ValueError

        opStack = Stack()
        postOrderList = list
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值