力扣刷题-栈-逆波兰表达式求值

news2025/7/28 14:25:19

150. 逆波兰表达式求值

根据 逆波兰表示法,求表达式的值。
有效的运算符包括 + , - , * , / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
说明:
整数除法只保留整数部分。 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。
示例 1:
输入: [“2”, “1”, “+”, “3”, " * "]
输出: 9
解释: 该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9
示例 2:
输入: [“4”, “13”, “5”, “/”, “+”]
输出: 6
解释: 该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6
逆波兰表达式:是一种后缀表达式,所谓后缀就是指运算符写在后面。
平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 ) 。
该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * ) 。
逆波兰表达式主要有以下两个优点:

  • 去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。
  • 适合用栈操作运算:遇到数字则入栈;遇到运算符则取出栈顶两个数字进行计算,并将结果压入栈中。

思路

参考:https://www.programmercarl.com/0150.%E9%80%86%E6%B3%A2%E5%85%B0%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%B1%82%E5%80%BC.html
本题中每一个子表达式要得出一个结果,然后拿这个结果再进行运算,那么这岂不就是一个相邻字符串消除的过程,和1047.删除字符串中的所有相邻重复项中的对对碰游戏是不是就非常像了。

代码

class Solution(object):
    def evalRPN(self, tokens):
        """
        :type tokens: List[str]
        :rtype: int
        """
        # 后缀表达式 求值
        stack = []
        for i in range(len(tokens)):
            # 如果是运算符法 则需要弹出栈顶部两个元素 进行计算
            if tokens[i]=='+' or tokens[i]=='-' or tokens[i]=='*' or tokens[i]=='/':
                num1 = stack[-1] # 栈顶元素 注意原本是字符
                stack.pop() # 删除栈顶元素
                num2 = stack[-1] # 栈顶元素 其实是最开始栈顶的倒数第二个元素
                stack.pop()
                if tokens[i]=='+':
                    result = num1 + num2 # 计算结果
                    stack.append(result) # 将结果添加至栈
                elif tokens[i]=='-':
                    result = num1 - num2 # 计算结果
                    stack.append(result) # 将结果添加至栈
                elif tokens[i]=='*':
                    result = num1 * num2 # 计算结果
                    stack.append(result) # 将结果添加至栈
                elif tokens[i]=='/':
                    result = num1 / num2 # 计算结果
                    stack.append(result) # 将结果添加至栈
            else: # 如果是数字
                stack.append(int(tokens[i])) # 记得int转为整型数字
        return stack[-1]

但上述代码是有问题的!!! 存在两个问题:

  • 第一个是:在遇到运算符的时候,需要退出栈顶两个元素,退出的第一个元素num1应该放在运算符右边,退出的第二个元素num2应该放在运算符左边,所以加法时候运算规则应该是:num2 + num1
  • 第二个是:在除法运算时候,需要注意python的具体情况。

python 的整数除法是向下取整,而不是向零取整。
python2 的除法 “/” 是整数除法, “-3 / 2 = -2” ;
python3 的地板除 “//” 是整数除法, “-3 // 2 = -2” ;
python3 的除法 “/” 是浮点除法, “-3 / 2 = -1.5” ;
而 C++/Java 中的整数除法是向零取整。
C++/Java 中 “-3 / 2 = -1” .
本题的题意(一般情况)都是要求向零取整的。(遇到python除法的时候就应该想到)
对 Python 的整数除法问题,可以用** int(num2 / float(num1)) **来做,即先用浮点数除法,然后取整。
无论如何,浮点数除法都会得到一个浮点数,比如 “-3 / 2.0 = 1.5” ;
此时再取整,就会得到整数部分,即 int(-1.5) = -1 。
参考链接:https://leetcode.cn/problems/evaluate-reverse-polish-notation/solutions/668342/xiang-jie-ni-bo-lan-biao-da-shi-fu-ben-t-sfl6/
所以修正之后的代码:

class Solution(object):
    def evalRPN(self, tokens):
        """
        :type tokens: List[str]
        :rtype: int
        """
        # 后缀表达式 求值
        stack = []
        for i in range(len(tokens)):
            # 如果是运算符法 则需要弹出栈顶部两个元素 进行计算
            if tokens[i]=='+' or tokens[i]=='-' or tokens[i]=='*' or tokens[i]=='/':
                num1 = stack.pop() # 栈顶元素 
                num2 = stack.pop() # 栈顶元素 其实是最开始栈顶的倒数第二个元素
                if tokens[i]=='+':
                    result = num2 + num1 # 计算结果 注意第一个出来的在运算符后面
                    stack.append(result) # 将结果添加至栈
                elif tokens[i]=='-':
                    result = num2 - num1 # 计算结果
                    stack.append(result) # 将结果添加至栈
                elif tokens[i]=='*':
                    result = num2 * num1 # 计算结果
                    stack.append(result) # 将结果添加至栈
                elif tokens[i]=='/':
                    result = int(num2 / float(num1)) # 计算结果 注意!!
                    stack.append(result) # 将结果添加至栈
            else: # 如果是数字
                stack.append(int(tokens[i]))
        return stack.pop()

其他

我们习惯看到的表达式都是中缀表达式,因为符合我们的习惯,但是中缀表达式对于计算机来说就不是很友好了。
例如:4 + 13 / 5,这就是中缀表达式,计算机从左到右去扫描的话,扫到13,还要判断13后面是什么运算符,还要比较一下优先级,然后13还和后面的5做运算,做完运算之后,还要向前回退到 4 的位置,继续做加法,你说麻不麻烦!
那么将中缀表达式,转化为后缀表达式之后:[“4”, “13”, “5”, “/”, “+”] ,就不一样了,计算机可以利用栈来顺序处理,不需要考虑优先级了。也不用回退了, 所以后缀表达式对计算机来说是非常友好的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1156440.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

YOLO算法改进3【中阶改进篇】:添加HorNet卷积模块

论文地址:https://arxiv.org/pdf/2207.14284.pdf 源码地址:https://github.com/raoyongming/HorNet. HorNet是在Swin transformer结构的基础上,结合大核思想提出的新的网络结构模块,使用该模块,作者在ImageNet-1k数据集上做分类,分割以及检测任务都在当时达到了SOTA的效果…

基于Langchain+向量数据库+ChatGPT构建企业级知识库

▼最近直播超级多,预约保你有收获 近期直播:《基于 LLM 大模型的向量数据库企业级应用实践》 1— LangChain 是什么? 众所周知 OpenAI 的 API 无法联网的,所以如果只使用自己的功能实现联网搜索并给出回答、总结 PDF 文档、基于某…

【机器学习】二、决策树

目录 一、决策树定义: 二、决策树特征选择 2.1 特征选择问题 2.2 信息增益 2.2.1 熵 2.2.2 信息增益 三、决策树的生成 3.1 ID3算法 3.1.1理论推导 3.1.2代码实现 3.2 C4.5 算法 3.2.1理论推导 ​ 3.2.2代码实现 四、决策树的剪枝 4.1 原理 4.2 算法思路&#xff1a…

VMware虚拟网络连接的三种方式

桥接模式(Bridged) 什么是桥接模式?桥接模式就是将主机网卡与虑拟机虑拟的网卡利用虑拟网桥进行通信。在桥接的作用下,类似于把物理主机虑拟为一个交换机,所有桥接设置的虚拟机连接到这个交换机的一个接口上,物理主机也同样插在这个交换机当…

cocos creator,vscode打开脚本报错,找不到cc模块问题

cocosCreator,用VSCODE打开写脚本代码的时候,会误报飘红,但实际上能正常运行。 我的版本是当前最新版本的3.8.1 解决方案: 在CocosCreator 的安装目录下 C:\ProgramData\cocos\editors\Creator\3.8.1\resources\resources\3d\engine\bin.dec…

Python---排序算法

文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 Python中的排序算法用于对数据进行排序。排序算法可以使数据按照一定的规则进行排列,以便于数据的查找、统计、比较等操作。在数据分析、机器学习、图形计算等领域&#xff0c…

企业中很多老师傅都说没前途,该不该放弃嵌入式单片机行业?

今日话题,很多老师傅都说没前途,该不该放弃嵌入式单片机行业?许多新手在探讨嵌入式和单片机行业时,往往过于强调技术技能,而忽略了 行业的广度和深度。事实上,行业内有各种不同的产品领域,而你的…

IBM引入模块化设计助力波音与摩根大通快速实现量子计算服务

​(图片来源:网络) 经典计算机具有局限性,无法完成某些特定任务,例如准确预测金融市场或开发药物来对抗新兴疾病,而量子计算能打破“僵局”。部署IBM Quantum量子系统的负责人Chris Lirakis 说&#xff1a…

#stm32整理(一)flash读写

以这篇未开始我将进行stm32学习整理为期一个月左右完成stm32知识学习整理内容顺序没有一定之规写到哪想到哪想到哪写到哪,主要是扫除自己知识上的盲区完成一些基本外设操作。 以stm32f07为例子进行flash读写操作 stm32flash简介 参考资料正点原子和野火开发手册 …

国际权威媒体聚焦:孙宇晨和波场TRON在迪拜荣获加密行业重磅奖项

近日,在迪拜举行的区块链生态大会(Blockchain Life Conference)上,波场TRON创始人、火币HTX全球顾问委员会委员孙宇晨斩获“年度加密企业家”称号,波场TRON荣膺“年度最佳 Layer 1”大奖。这一消息迅速得到彭博社、雅虎财经、美联社和法国最大媒体之一Le Figaro等国际权威媒体的…

决赛入围名单公示!“山东工行杯”山东省第五届数据应用创新创业大赛

“山东工行杯”山东省第五届数据应用创新创业大赛8月30日启动以来,共计吸引2651人、1235支团队报名,累计收到作品1451件。 10月18日—24日,大赛组委会本着“公平、公正、公开”的原则,邀请到来自省内外各高校、企事业单位的、在数…

Python 应用 之 转换音频格式

目录 一、python音频转换 1、pydub 音频包安装 2、 ffmpeg安装 1)、解压后,添加到环境变量中 2)、可以直接放在python安装目录下 3、python程序 1)、引入相关包 2)、重命名 3)、to Mp3 4&#xf…

基于差分进化算法的无人机航迹规划-附代码

基于差分进化算法的无人机航迹规划 文章目录 基于差分进化算法的无人机航迹规划1.差分进化搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要:本文主要介绍利用差分进化算法来优化无人机航迹规划。 …

化肥厂的污水处理设备需要哪些

化肥厂的污水处理设备需要包括多级反渗透系统、生物处理系统、滤网、沉淀池、活性炭吸附器、曝气池和膜分离器等。 这些设备的主要作用是处理化肥厂产生的大量污水,包括对污水进行物理、化学和生物处理,以去除其中的污染物质和有害成分,达到…

Vue过渡动画详解及使用场景

文章目录 Vue过渡和动画的主要概念1. `<transition>` 组件2. `<transition-group>` 组件3. CSS 过渡类4. 过渡钩子函数Vue过渡和动画应用场景1. 页面切换动画2. 表单验证反馈3. 列表排序和过滤4. 模态框和对话框✍创作者:全栈弄潮儿 🏡 个人主页: 全栈弄潮儿的…

C语言实现贪吃蛇小游戏

#include <stdio.h> #include <easyx.h> #include <iostream> #include <math.h> #include <stdlib.h> #include <conio.h> #include <time.h> #define PI 3.14 #define NODE_WIDTH 40 //绘制蛇的节点 typedef struct {int x;int y;…

【Java 进阶篇】Java Response 重定向详解

在Java Web开发中&#xff0c;重定向&#xff08;Redirect&#xff09;是一种常见的技术&#xff0c;用于将用户从一个URL地址自动重定向到另一个URL地址。这在很多情况下都非常有用&#xff0c;例如在用户登录后将其重定向到其个人资料页面&#xff0c;或者在进行某些操作后将…

自己动手实现一个深度学习算法——二、神经网络的实现

文章目录 1. 神经网络概述1&#xff09;表示2&#xff09;激活函数3&#xff09;sigmoid函数4&#xff09;阶跃函数的实现5&#xff09;sigmoid函数的实现6)sigmoid函数和阶跃函数的比较7&#xff09;非线性函数8&#xff09;ReLU函数 2.三层神经网络的实现1&#xff09;结构2&…

现代的简洁,诠释轻奢的精致!福州中宅装饰,福州装修

轻奢风是一种生活新时尚 优雅、低调、舒适、简单&#xff0c;不断地推陈出新 站在时尚的前沿&#xff0c;引领潮流 中宅装饰集团轻奢风格产品 追求高品质生活细节 以设计精致的空间构造营造出 一种优雅、时尚生活氛围 将低调奢华之美注入现代家居设计中 客厅|The Sitt…

JVM 分代垃圾回收过程

堆空间划分了代&#xff1a; 年轻代&#xff08;Young Generation&#xff09;分为 eden 和 Survivor 两个区&#xff0c;Survivor 又分为2个均等的区&#xff0c;S0 和 S1。 首先&#xff0c;新对象都分配到年轻代的 eden 空间&#xff0c;Survivor 刚开始是空的。 当 eden …