算法练习-逆波兰表达式求值(思路+流程图+代码)

难度参考

        难度:中等

        分类:栈与队列

        难度与分类由我所参与的培训课程提供,但需要注意的是,难度与分类仅供参考。且所在课程未提供测试平台,故实现代码主要为自行测试的那种,以下内容均为个人笔记,旨在督促自己认真学习。

题目     

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

        说明:

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

        示例1:

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

        解释:该算式转化为常见的中缀算术表达式为:(2+1)*3)=9

        示例2:
        输入:["4","13","5","/","+"门

        输出:6
        解释:该算式转化为常见的中缀算术表达式为:(4+(13/5)=6

思路

        逆波兰表达式求解的一般思路是使用栈来存储操作数,然后遍历逆波兰表达式的每个元素,根据遇到的操作符进行相应的计算,并将结果重新入栈。遍历逆波兰表达式,并根据运算符进行相应的计算操作。

        具体步骤如下:

  1. 定义一个栈,用于存储中间结果。
  2. 遍历逆波兰表达式,对于每个元素:
    • 如果是数字,则将其转换为整数并压入栈中。
    • 如果是运算符,则从栈中取出两个数字进行相应的运算。将运算结果压入栈中。
  3. 遍历结束后,栈中存储的元素即为表达式的最终结果。

示例

        逆波兰表达式是一种不需要括号的数学表达式表示法,操作符位于操作数之后。

        主要思路是使用一个栈来存储操作数,并依次遍历输入的表达式。当遇到操作符时,从栈中弹出对应数量的操作数,并根据操作符进行相应的运算,将运算结果压入栈中。当遍历完整个表达式后,栈中只会剩下一个元素,即表达式的最终结果。

        举个例子来说明,假设我们要求解的逆波兰表达式是:2 1 + 3 *。我们依次遍历表达式中的每个字符:

  • 第一个字符 “2” 是一个操作数,我们直接将其压入栈中;
    "2", "1", "+", "3", "*"  //字符^st={2}                    //数字
  • 第二个字符 “1” 是另一个操作数,同样将其压入栈中;
    "2", "1", "+", "3", "*"  //字符^st={2, 1}                    //数字
  • 第三个字符 “+” 是一个加法操作符,此时栈中的顶部两个元素分别是 1 和 2,我们将它们弹出并做加法运算得到 3,将结果 3 压入栈中;
    "2", "1", "+", "3", "*"  //字符^st={3}                    //数字
  • 第四个字符 “3” 是一个操作数,将其压入栈中;
    "2", "1", "+", "3", "*"  //字符^st={3, 3}                    //数字
  • 最后一个字符 “*” 是一个乘法操作符,此时栈中的顶部两个元素分别是 3 和 3,弹出并做乘法运算得到 9,将结果 9 压入栈中。
    "2", "1", "+", "3", "*"  //字符^st={9}                    //数字

        最终栈中只剩下一个元素 9,即为表达式的结果。

梳理

        根据逆波兰表达式的性质,每当遇到一个操作符时,它前面的两个操作数已经被处理过并保存在栈中。所以,我们只需要从栈中弹出这两个操作数,根据操作符进行相应的运算,并将结果再次压入栈中。

  • 没有括号:逆波兰表达式的特点是不需要括号来标识优先级,因为操作数和操作符的顺序已经明确,不存在歧义。
  • 简化运算符的处理:由于操作符总是位于操作数之后,栈可以很方便地保存操作数。每当遇到一个操作符,只需要从栈中弹出所需的操作数进行运算,而不需要关心操作数之间的顺序或优先级。
  • 遍历一次求解:由于逆波兰表达式的特点,我们只需要遍历一次表达式即可求解,无需进行多次迭代或递归。

        总体来说,通过利用栈的先入后出(LIFO)的特性,将逆波兰表达式转化为了一种线性的、遍历一次即可求解的算法,从而实现了逆波兰表达式的求值。

代码

#include <iostream> // 包含输入输出流库,用于标准输入输出
#include <stack> // 包含栈库,用于存储操作数
#include <vector> // 包含向量库,用于存储输入的逆波兰表达式
#include <string> // 包含字符串库,用于操作字符串
#include <cstdlib> // 包含标准库,用于字符串转整数的函数using namespace std; // 使用标准命名空间int evalRPN(vector<string>& tokens) { // 定义了一个函数,用于计算逆波兰表达式的值,参数为存储表达式的向量stack<int> st; // 创建一个整型栈对象,用于存储操作数for (string& token : tokens) { // 遍历逆波兰表达式的每个元素if (token == "+") { // 如果当前元素为加号int num2 = st.top(); // 取出栈顶元素作为第二个操作数st.pop(); // 弹出栈顶元素int num1 = st.top(); // 取出新的栈顶元素作为第一个操作数st.pop(); // 弹出栈顶元素st.push(num1 + num2); // 将计算结果入栈} else if (token == "-") { // 如果当前元素为减号,逻辑同上int num2 = st.top();st.pop();int num1 = st.top();st.pop();st.push(num1 - num2);} else if (token == "*") { // 如果当前元素为乘号,逻辑同上int num2 = st.top();st.pop();int num1 = st.top();st.pop();st.push(num1 * num2);} else if (token == "/") { // 如果当前元素为除号,逻辑同上int num2 = st.top();st.pop();int num1 = st.top();st.pop();st.push(num1 / num2);} else { // 如果当前元素为数字st.push(stoi(token)); // 将字符串转换为整数后入栈}}return st.top(); // 返回栈中最终的结果
}int main() { // 主函数vector<string> tokens = {"2", "1", "+", "3", "*"}; // 创建一个存储逆波兰表达式的向量,其中元素为字符串int result = evalRPN(tokens); // 调用 evalRPN 函数计算表达式的值cout << result << endl; // 输出计算结果tokens = {"4", "13", "5", "/", "+"}; // 更新逆波兰表达式result = evalRPN(tokens); // 调用 evalRPN 函数计算表达式的值cout << result << endl; // 输出计算结果return 0; // 返回 0,表示正常结束程序
}

打卡

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

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

相关文章

Plant, Cell Environment:DNA pull down技术助力揭示AP2/ERF类转录因子提高芍药耐高温能力的分子机制

芍药是一种传统的中药材&#xff0c;并且具有极高的欣赏价值&#xff0c;其生长发育经常受到高温胁迫的影响。褪黑素是一种内源性微分子吲哚胺化合物&#xff0c;在各种生物体中具有多种生理功能&#xff0c;大量研究表明调节与褪黑素生物合成相关的基因来提高植物对高温的耐受…

《区块链简易速速上手小册》第8章:区块链的技术挑战(2024 最新版)

文章目录 8.1 可扩展性问题8.1.1 基础知识8.1.2 主要案例&#xff1a;比特币的可扩展性挑战8.1.3 拓展案例 1&#xff1a;以太坊的可扩展性改进8.1.4 拓展案例 2&#xff1a;侧链和分层解决方案 8.2 安全性与隐私8.2.1 基础知识8.2.2 主要案例&#xff1a;比特币交易的安全性8.…

DVI接口如何连接HDMI接口显示器?DVI转HDMI转换器DHA

DVI转HDMI转换器DHA简介 DVI转HDMI转换器DHA能够将DVI信号和R/L音频信号输入转换成HDMI信号输出,独特的功能使其顺畅地整合到家庭影院中&#xff0c;并且播放出高品质的图像。主要用于数据监控中心、大型会议展示中心、学校及各个公司 DVI转HDMI转换器DHA特点 01.支持分辨率4K…

网络协议 TCP协议

网络协议 TCP协议 文章目录 网络协议 TCP协议1. TCP协议段格式2. 可靠传输保障机制2.1 确认应答2.2 超时重传 3. 连接保障机制3.1 三次握手&#xff08;建立连接&#xff09;3.2 四次挥手&#xff08;断开连接&#xff09;3.3 TCP状态转换过程 4. 传输效率保障机制4.1 滑动窗口…

MySQL原理(二)存储引擎(1)概述

一、存储引擎介绍 1、概念&#xff1a; &#xff08;1&#xff09;MySQL中的数据用各种不下同的技术存储在文件中&#xff0c;每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力&#xff0c;这些不同的技术以及配套的功能在MySQL中称为存储引擎…

【全csdn最前沿LVGL9】按钮的使用(lv_button)、标签的使用(lv_label)

文章目录 前言一、按钮概述二、按钮的使用2.1 创建一个按钮2.2 按钮的样式 三、标签概述四、标签的使用4.1 创建一个标签4.2 样式4.3 设置文本4.4 长文本模式4.5 文本选择4.6 文本对齐4.7 非常长的文本4.8 字体设置字体支持的Unicode字符字体列表特殊的字体 总结 前言 欢迎来到…

Unity使用反向遮罩实现镂空shader

实现步骤&#xff1a; 1&#xff0c;创建两个材质球&#xff0c;遮罩层的属性如下&#xff1a; 被遮罩层的属性如下&#xff1a; 2&#xff0c;使用两张image&#xff0c;遮罩层在父节点&#xff0c;被遮罩层在子节点&#xff0c;然后分别添加材质球与镂空图片 实现效果如下&a…

k8s存储之PV、PVC

在k8s集群中&#xff0c;资源存储会散落到各个工作节点上&#xff0c;这样对用资源调用很不方便&#xff0c;那么k8s是如何实现存储资源共享的呢&#xff0c;本文浅尝辄止的探讨一下&#xff0c;k8s是通过pv、pvc实现的。 一、PV、PVC的概念 1、持久卷(PV&#xff09; pv是Pe…

2024-01-07-AI 大模型全栈工程师 - AI 产品部署和交付

摘要 2024-01-07 周日 杭州 阴 本节内容: 如何选择 GPU 和云服务器&#xff0c;追求最高性价比如何部署自己的 fine-tune 的模型&#xff0c;向业务提供高可用服务如何控制内容安全&#xff0c;做好算法备案&#xff0c;确保合规 课程内容 1. 硬件选型 a. Nvidia 几乎是模…

IAR编译和调试CMS32L051

0 Preface/Foreword 0.1 参考文档 中微半导体BAT系列单片机学习笔记_V1.1.pdf 1 配置方法 1.1 编译工具链添加 CMS对于IAR工具&#xff0c;有一个插件文件&#xff0c;用于安装对应的CMS系列芯片。 工具名称&#xff1a;iar_plug20210926.7z 按照完成之后&#xff0c;可…

如果我要访问一个网址,那么在网络中会有哪些过程

访问一个网址是我们日常网络使用中非常常见的操作&#xff0c;背后涉及到一系列精密而复杂的步骤。这个过程包括DNS解析、建立TCP连接、发起HTTP请求、服务器处理请求、服务器响应、浏览器渲染等环节。在这篇文章中&#xff0c;我们将深入探讨这些步骤&#xff0c;并解释它们在…

强大的虚拟机Parallels Desktop 19 mac中文激活

Parallels Desktop是一款功能全面、易于使用的虚拟机软件&#xff0c;它为用户提供了在Mac电脑上同时运行多个操作系统的便利。 软件下载&#xff1a;Parallels Desktop 19 mac中文激活版下载 Parallels Desktop 19 mac具有快速启动和关闭虚拟机的能力&#xff0c;让用户能够迅…

基于SpringBoot+Vue学科竞赛管理系统

文章目录 基于SpringBootVue学科竞赛管理系统1系统概述1.3系统设计思想 2相关技术2.1 MYSQL数据库2.2 B/S结构2.3 Spring Boot框架简介2.4 Vue简介 3系统分析3.1可行性分析3.1.1技术可行性3.1.2经济可行性3.1.3操作可行性 3.2系统性能分析3.2.1 系统安全性3.2.2 数据完整性 3.4…

Wampserver 切换中文时无法启动报错处理

在使用 Wampserver 软件时默认为英语&#xff0c;可以看到有语言选择功能&#xff0c;切换其他语言。但选择中文切换后&#xff0c;软件重启时报如下错误&#xff1a; The configuration file contains a systax error on line 44:[EParseError] Mismatched or misplaced quoue…

(十六)串口UART

文章目录 UART简介传输数据帧和波特率定时器1作为串口1波特率发生器串口部分相关寄存器TMODAUXRPCONSCONSBUF 串口1工作模式1&#xff1a;8位UART&#xff0c;波特率可变总体工作原理如何简单接收一个字符和发送数据一步之遥的设置现象演示 UART简介 通用异步收发传输器(Unive…

一种轻量分表方案-MyBatis拦截器分表实践|京东零售技术实践

背景 部门内有一些亿级别核心业务表增速非常快&#xff0c;增量日均100W&#xff0c;但线上业务只依赖近一周的数据。随着数据量的迅速增长&#xff0c;慢SQL频发&#xff0c;数据库性能下降&#xff0c;系统稳定性受到严重影响。本篇文章&#xff0c;将分享如何使用MyBatis拦…

微软Azure-OpenAI 测试调用及说明

本文是公司在调研如何集成Azure-openAI时&#xff0c;调试测试用例得出的原文&#xff0c;原文主要基于官方说明文档简要整理实现 本文已假定阅读者申请部署了模型&#xff0c;已获取到所需的密钥和终结点 变量名称值ENDPOINT从 Azure 门户检查资源时&#xff0c;可在“密钥和…

Advanced CNN

文章目录 回顾Google NetInception1*1卷积Inception模块的实现网络构建完整代码 ResNet残差模块 Resedual Block残差网络的简单应用残差实现的代码 练习 回顾 这是一个简单的线性的卷积神经网络 然而有很多更为复杂的卷积神经网络。 Google Net Google Net 也叫Inception V…

5、应急响应-拒绝服务钓鱼识别DDOS压力测试邮件反制分析应用日志

目录 前言&#xff1a; 1、#内网应急-日志分析-爆破&横向&数据库 2、#红队APT-钓鱼邮件识别-内容&发信人&附件 3、#拒绝服务攻击-DDOS&CC-代理&防火墙防御 用途&#xff1a;个人学习笔记&#xff0c;欢迎指正&#xff01; 前言&#xff1a; 了解和…

OkHttp完全解读

一&#xff0c;概述 OkHttp作为android非常流行的网络框架&#xff0c;笔者认为有必要剖析此框架实现原理&#xff0c;抽取并理解此框架优秀的设计模式。OkHttp有几个重要的作用&#xff0c;如桥接、缓存、连接复用等&#xff0c;本文笔者将从使用出发&#xff0c;解读源码&am…