python四则运算表达式求值示例详解

目录
  • 四则运算表达式求值
    • 思路说明
    • 算法步骤
    • 代码

四则运算表达式求值

思路说明

使用双栈来实现——存放数值的栈 nums 与存放运算符的栈 ops.

算法步骤

  • 对原始表达式字符串 exp 进行预处理, 将其转为一个元素对应一个数值或运算符的列表 explist.
  • 遍历 explist , 每个元素依次压入对应的栈中. 每次压入后, 判断当前两栈顶是否可进行乘除运算.栈顶可进行乘除运算的充要条件是, ops 栈顶为<*> ,</> 之一, 且 nums 中的元素比 ops 中的元素恰好多一个. 如果可以运算, 则运算, 并将运算结果压回 nums 中.
  • explist 遍历完之后, 所有乘除运算都已进行, 此时 ops 中只剩加法与减法, 接下来开始另一个循环, 一直运算即可. 最后 nums 中剩余的唯一元素即为表达式的值.

代码

def operation(a, b, op: str):
    """
    计算一次运算的结果
    :param a: val
    :param b: val
    :param op: 运算符
    :return: val
    """
    if op == '+':
        return a+b
    elif op == '-':
        return a-b
    elif op == '*':
        return a*b
    elif op == '/':
        return a/b
    else:
        raise Exception('运算符不正确')
def exp_str2list(exp: str):
    """
    将表达式exp:str转成list,每个元素对应一个数<num>或运算符<op>.
    已知exp是标准的四则运算表达式字符串.
    :param exp: str,表达式
    :return: list
    """
    opset = {'+', '-', '*', '/'}  # 运算符集合
    flag = -1
    explist = list()
    for i, char in enumerate(exp):  # 对表达式字符串中的每个字符
        if char in opset:  # 若char是运算符
            explist.append(exp[flag+1:i])  # 上一个运算符到当前运算符中间为数字,保存到explist
            flag = i  # 更新flag到当前op位置
            explist.append(char)  # 当前op亦加入explist
    explist.append(exp[flag+1:])
    return explist
def calculate_expression(exp: str):
    """
    表达式求值. 计算字符串exp所代表的表达式的值, 返回一个数值
        已知exp是标准的四则运算表达式字符串, 且不含括号.
    :param exp: str, 表达式
    :return: val
    """
    opset = {'+', '-', '*', '/'}
    nums = list()  # 数栈
    ops = list()  # 运算符栈
    explist = exp_str2list(exp)
    print(explist)
    for e in explist:
        # e入栈
        if e in opset:  # 若e是运算符
            ops.append(e)
        else:
            nums.append(eval(e))
        # 若e是优先级高的乘除法, 且
        # nums与ops恰好匹配, 栈顶可以进行一次计算, 运算结果压入回nums
        if ops and ops[-1] in {'*', '/'} and len(nums) == len(ops) + 1:
            op = ops.pop()
            y = nums.pop()
            x = nums.pop()
            nums.append(operation(x, y, op))
    # 此时explist中元素已全部遍历, 同时乘除法均已被运算, 双栈只剩加减法有待运算. 众所周知, 加减法服从结合律, 接下来一路算到底即可.
    while ops:
        op = ops.pop()
        y = nums.pop()
        x = nums.pop()
        x_op_y = operation(x, y, op)
        nums.append(x_op_y)
    return nums[0]
if __name__ == '__main__':
    exp = '1*43+542+532*432'
    print(calculate_expression(exp))
    print(eval(exp))

参考 python开发任意表达式求值全功能示例

以上就是python四则运算表达式求值示例详解的详细内容,更多关于python四则运算表达式求值的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python利用正则表达式从字符串提取数字

    目录 前言 利用正则表达式从字符串提取数字 附python正则表达式抽取文本中的时间日期 总结 前言 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式. re 模块使 Python 语言拥有全部的正则表达式功能. 利用正则表达式从字符串提取数字 主要用到下面几个函数 (1)compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象.该对象拥有一系列方法用于正则

  • python开发任意表达式求值全功能示例

    目录 正文 完整的源代码 正文 在之前的基础上进一步实现了全功能表达式求值. 已支持浮点数 已支持字符串的处理,前加一个"(类似lisp语法) 支持减号/负号,一符两用机制 支持所有算术运算符,包括**,//, % 支持全部7个比较运算符 支持与或非3个逻辑运算符 支持自定义数学函数(代码中预设sin函数作为示范) 支持外部提供的变量机制 支持外部设置函数(代码中预设isvar函数作为示范) 支持列表 字典的支持,体现在外部的变量中 结构清晰,易于扩展 具有实用性及学习性 与其说距离DSL只有一

  • python常用的正则表达式大全

    1.正则表达式 正则表达式是用来匹配与查找字符串的,从网上爬取数据自然或多或少会用到正则表达式,python的正则表达式要先引入re模块,正则表达式以r引导,例如: 其中**r“\d+”**正则表达式表示匹配连续的多个数值,search是re中的函数,从"abc123cd"字符串中搜索连续的数值,得到"123",返回一个匹配对象,结果如上. 2.字符串"\d"匹配0~9之间的一个数值 3.字符"+"重复前面一个匹配字符一次或者

  • python数据操作之lambda表达式详情

    目录 1 前言 2 lambda 的特性 3 lambda 的一些用法 3.1 map 函数 3.2 reduce 函数 3.3 sorted 函数 3.4 filter 函数 4 总结 1 前言 在 Java 和 js 中,lambda箭头函数是十分常见的操作,这种表达方式在使用时非常的简便.在python的语法中也有应用场景,lambda是python预留的关键字,带有该关键字的都视为lambda, 其表现形式如下: # lambda 是表达式, arg 是用户输入参数 expression

  • python四则运算表达式求值示例详解

    目录 四则运算表达式求值 思路说明 算法步骤 代码 四则运算表达式求值 思路说明 使用双栈来实现——存放数值的栈 nums 与存放运算符的栈 ops. 算法步骤 对原始表达式字符串 exp 进行预处理, 将其转为一个元素对应一个数值或运算符的列表 explist. 遍历 explist , 每个元素依次压入对应的栈中. 每次压入后, 判断当前两栈顶是否可进行乘除运算.栈顶可进行乘除运算的充要条件是, ops 栈顶为<*> ,</> 之一, 且 nums 中的元素比 ops 中的元素

  • JavaScript数据结构中栈的应用之表达式求值问题详解

    本文实例讲述了JavaScript数据结构中栈的应用之表达式求值问题.分享给大家供大家参考,具体如下: 下面来谈一个比较经典的表达式求值问题,这个问题主要是设计到操作符的优先级.我们通常看到的表达式都是中缀表达式,存在很多优先级差别,而后缀表达式则没有这些优先级问题.下面先看看两种表达式的区别. 中缀表达式:a*b+c*d-e/f      后缀表达式:ab*cd*+ef/- 从中缀表达式转换到后缀表示式是很难实现的,我们这里可以通过栈的思想来实现.下面进行详细的介绍是什么样的思想: 在对一个中

  • 利用Python如何生成hash值示例详解

    一.介绍 如果在Python中需要对用户输入的密码或者其他内容进行加密,首选的方法是生成hash值. 在Python中可以利用二个模块来进行: - crypt - hashlib 二.crypt (一)crypt的主要方法和常量 名称 描述 md5(-) 利用md5算法加密 sha1(-) 利用sha1算法加密 sha224(-) 利用sha224算法加密 sha256(-) 利用sha256算法加密 sha384(-) 利用sha384算法加密 sha512(-) 利用sha512算法加密 (

  • python实现PCA降维的示例详解

    概述 本文主要介绍一种降维方法,PCA(Principal Component Analysis,主成分分析).降维致力于解决三类问题. 1. 降维可以缓解维度灾难问题: 2. 降维可以在压缩数据的同时让信息损失最小化: 3. 理解几百个维度的数据结构很困难,两三个维度的数据通过可视化更容易理解. PCA简介 在理解特征提取与处理时,涉及高维特征向量的问题往往容易陷入维度灾难.随着数据集维度的增加,算法学习需要的样本数量呈指数级增加.有些应用中,遇到这样的大数据是非常不利的,而且从大数据集中学习

  • Python线性点运算数字图像处理示例详解

    目录 点运算 定义 分类 线性点运算 分段线性点运算 非线性点运算 对数变换 幂次变换 点运算 定义 分类 线性点运算 例子: 分段线性点运算 非线性点运算 对数变换 幂次变换 1. 点运算是否会改变图像内像素点之间的空间位置关系? 点运算是一种像素的逐点运算,它与相邻的像素之间没有运算关系,点运算不会改变图像内像素点之间的空间位置关系. 2. 对图像灰度的拉伸,非线性拉伸与分段线性拉伸的区别? 非线性拉伸不是通过在不同灰度值区间选择不同的线性方程来实现对不同灰度值区间的扩展与压缩,而是在整个灰

  • Python面向对象编程repr方法示例详解

    目录 为什么要讲 __repr__ 重写 __repr__ 方法 str() 和 repr() 的区别 为什么要讲 __repr__ 在 Python 中,直接 print 一个实例对象,默认是输出这个对象由哪个类创建的对象,以及在内存中的地址(十六进制表示) 假设在开发调试过程中,希望使用 print 实例对象时,输出自定义内容,就可以用 __repr__ 方法了 或者通过 repr() 调用对象也会返回 __repr__ 方法返回的值 是不是似曾相识....没错..和 __str__ 一样的

  • python函数传参意义示例详解

    目录 C++这样的语言用多了之后,在Python函数传递参数的时候,经常会遇到一个问题,我要传递一个引用怎么办? 比如我们想要传一个x到函数中做个运算改变x的值: def change(y): y += 1 x = 1 print ("before change:", x) change(x) print ("after change: ", x) 得到的结果是 before change: 1 after change:  1 完全没用~~~这是怎么回事? 我来说

  • Python实现连接dr校园网示例详解

    目录 背景 分析 实现 背景 在校园里认证上网很麻烦需要web输入账号密码有时还会忘记web地址此时就需要一个人或者程序帮我们实现,这时我想到用python制作这个程序(初学者python代码不规范) 分析 需要分析web登录网址的浏览器头发现是get方法这就简单了,再次分析get请求发现有user_account字段,user_password字段还有ip字段mac字段这时我们的思路就来了使用curl命令直接把这个代码放到终端里运行发现是可以的 curl "http://学校认证服务器ip:8

  • Python+matplotlib实现绘制等高线图示例详解

    目录 前言 1. 等高线图概述 什么是等高线图? 等高线图常用场景 绘制等高线图步骤 案例展示 2. 等高线图属性 设置等高线颜色 设置等高线透明度 设置等高线颜色级别 设置等高线宽度 设置等高线样式 3. 显示轮廓标签 4. 填充颜色 5. 添加颜色条说明 总结 前言 我们在往期对matplotlib.pyplot()方法学习,到现在我们已经会绘制折线图.柱状图.散点等常规的图表啦(往期的内容如下,大家可以方便查看往期内容) Python matplotlib底层原理解析 Python利用 m

  • Python OpenCV实现图形检测示例详解

    目录 1. 轮廓识别与描绘 1.1 cv2.findComtours()方法 1.2 cv2.drawContours() 方法 1.3 代码示例 2. 轮廓拟合 2.1 矩形包围框拟合 - cv2.boundingRect() 2.2圆形包围框拟合 - cv2.minEnclosingCircle() 3. 凸包 绘制 4. Canny边缘检测 - cv2.Canny() 4.1 cv2.Canny() 用法简介 4.2 代码示例 5. 霍夫变换 5.1 概述 5.2 cv2.HoughLin

随机推荐