当前位置: 首页 > news >正文

栈和队列——2.逆波兰表达式求值

力扣题目链接

根据 逆波兰表示法,求表达式的值。有效的运算符包括 + ,  - ,  * ,  / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。

说明:整数除法只保留整数部分。 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。

示例:

输入:["2", "1", "+", "3", " * "]
输出:9

题目是什么意思呢?就是将运算符号放在两个数的后面,示例中2,1,+就代表2+1=3,然后3,3,*就代表3*3=9。同时说明了整数除法只保留整数部分,那就代表了不会有小数出现。

用栈的思维理解就是,列表一个数一个数进栈,当发现当前要进栈的是运算符,那就从栈中吐出两个数用运算符进行运算,运算得到的数再进栈,一直重复直到最后得到值。

完整代码如下:

from operator import add, sub, muldef div(x, y):# 使用整数除法的向零取整方式return int(x / y) if x * y > 0 else -(abs(x) // abs(y))class Solution(object):op_map = {'+': add, '-': sub, '*': mul, '/': div}def evalRPN(self, tokens: List[str]) -> int:stack = []for token in tokens:if token not in {'+', '-', '*', '/'}:stack.append(int(token))else:op2 = stack.pop()op1 = stack.pop()stack.append(self.op_map[token](op1, op2))  # 第一个出来的在运算符后面return stack.pop()

首先,先定义一个函数,这个函数的作用是整除向零取整。有些同学会问,整数除法取整不是用//就可以了吗,为什么要特意定义一个函数?这是因为Python中的整除返回值向下取整不是像C语言中那样向0取整。这在x和y都大于0的时候并没有关系,但当y小于0时呢?例如6//-132到底取0还是取-1,正常运算时应该取0,但python中会默认向下取整取-1。所以这里要重新定义一个考虑所有情况的整数除法取整函数。在函数中还有一个问题,int(x/y)是取整数,那我可不可以直接用熟悉的x//y呢,当然可以,因为这个前提条件已经注明了使x*y>0。

接着定义了一个字典,是关于运算符和其对应的函数,这里为什么要用函数表示,而不能直接用python中运算符本身的含义呢?请接着往下看。

定义一个空栈,在字符串循环中,如果字符不是运算符中的某一个,那就是数字,让其以整数形式进入栈。在字符是运算符的情况下,推出栈中的两个元素op2(后进的数)和op1(先进的数),然后将self.op_map[token](op1, op2)压入栈,op_map[token]找到运算符对应的运算函数,例如“+”对应add,则self.add(op1, op2)。这里也可以解释上面提出为什么要用函数表示的问题,你如果用函数表示,这里的代码不好编写。

一直运算,直到最后栈中只存在一个值,return到推出栈的那个值。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • ReactiveStream
  • 智慧水务项目(二)django(drf)+angular 18 创建通用model,并对orm常用字段进行说明
  • 23. Hibernate 性能之缓存与缓存算法
  • Java重修笔记 第二十七天 匿名内部类
  • 用Python实现AI人脸识别
  • 如何开启idea中的断言功能?
  • 纯原创【车牌识别】基于图像处理的车牌识别——matlab项目实战(含GUI界面)详解
  • 最佳编程语言选择与学习路径探讨
  • 一文掌握Python全部条件执行语句(基础篇)
  • vue开启keep-alive缓存时,关于子组件上使用:key=“id“的问题以及解决方案
  • 5G三大场景:eMBB、mMTC、uRLLC
  • VMware Workstation17 安装 Windows 10 操作系统
  • 通过 ACM 论文模版学习 LaTeX 语法 【三、格式】
  • strimzi operator 部署kafka集群(可外部访问)
  • [M二分] lc3143. 正方形中的最多点数(二分答案+代码实现+模拟)
  • [Vue CLI 3] 配置解析之 css.extract
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 【Amaple教程】5. 插件
  • create-react-app做的留言板
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • iOS | NSProxy
  • Java多线程(4):使用线程池执行定时任务
  • js ES6 求数组的交集,并集,还有差集
  • js数组之filter
  • React+TypeScript入门
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 开源地图数据可视化库——mapnik
  • 网页视频流m3u8/ts视频下载
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 延迟脚本的方式
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • #Linux(帮助手册)
  • #预处理和函数的对比以及条件编译
  • $L^p$ 调和函数恒为零
  • (+4)2.2UML建模图
  • (C#)一个最简单的链表类
  • (C++17) std算法之执行策略 execution
  • (C语言)逆序输出字符串
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (学习日记)2024.02.29:UCOSIII第二节
  • (一) 初入MySQL 【认识和部署】
  • (转) Face-Resources
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .NET Core 发展历程和版本迭代
  • .NET IoC 容器(三)Autofac
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)
  • .net后端程序发布到nignx上,通过nginx访问
  • //解决validator验证插件多个name相同只验证第一的问题
  • [2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序