《剑指 Offer》专项突破版 - 面试题 36 : 详解后缀表达式(C++ 实现)

题目链接:LCR 036. 逆波兰表达式求值 - 力扣(LeetCode)

题目

后缀表达式是一种算术表达式,它的操作符在操作数的后面。输入一个用字符串数组表示的后缀表达式,请输出该后缀表达式的计算结果。假设输入的一定是有效的后缀表达式。例如,后缀表达式 ["2", "1", "3", "*", "+"] 对应的算术表达式是 "2 + 1 * 3",因此输出它的计算结果 5。

分析

后缀表达式又叫逆波兰表达式(Reverse Polish Notation, RPN),是一种将操作符放在操作数后面的算术表达式。通常用的是中缀表达式,即操作符位于两个操作数的中间,如 "2 + 1 * 3"。使用后缀表达式的好处是不需要使用括号。例如,中缀表达式的 "2 + 1 * 3" 和 "(2 + 1) * 3" 不相同。它们的后缀表达式分别为 "213*+" 和 "21+3*"。后缀表达式不使用括号也能无歧义地表达这两个不同的算术表达式。

面试小提示:

后缀表达式对于很多人而言可能是一个比较陌生的概念。应聘者在面试的时候遇到新的概念是很常见的。面试官有时故意提出新概念,用来考查应聘者的学习能力。在面试的时候如果遇到不太熟悉的概念,应聘者一定要先确保自己正确理解了这个概念,再动手做题。如果有不理解的地方,应聘者可以提出自己的疑问让面试官提供详细的信息,然后应聘者再列举几个例子向面试官描述自己的理解。如果面试官确认理解是正确的,应聘者再着手做题也不迟。应聘者一定不要害怕向面试官提出问题。能提出有针对性的问题是学习能力的重要体现,在面试过程中这是一个加分项

下面以 ["2", "1", "3", "*", "+"] 为例,分析后缀表达式的计算过程。从左到右扫描这个数组。首先遇到的是操作数 "2",由于这是后缀表达式,操作符还在后面。不知道操作符就不能做计算,于是先将 "2" 保存到某个数据容器中。接下来的两个还是操作数,"1" 和 "3",由于缺少操作符,因此还是不知道如何计算,只好也将它们先后保存到数据容器中。接下来遇到了一个操作符 "*"。按照后缀表达式的规则,这个操作符对应的操作数是 "1" 和 "3",于是将它们从数据容器中取出来。此时容器中有先后保存的 "2"、"1" 和 "3" 这 3 个操作数,此时取出的是后保存的两个,最先保存的 "2" 仍然留在数据容器中。这看起来是 "后进先出" 的顺序,所以可以考虑用来实现这个数据容器。

由于当前的操作符是 "*",因此将两个操作数 "1" 和 "3" 相乘,得到结果 "3"。这个结果可能会成为后面操作符的操作数,因此仍然将它入栈。最后遇到的是操作符 "+",此时栈中有两个操作数,即 "2" 和 "3",分别将它们出栈,然后计算它们的和,得到 "5",再将结果 "5" 入栈。此时整个后缀表达式已经计算完毕,留在栈中的唯一的操作数 "5" 就是结果

代码实现

class Solution {
public:int evalRPN(vector<string>& tokens) {stack<int> st;for (const string& s : tokens){if (s == "+" || s == "-" || s == "*" || s == "/"){int rightOperand = st.top();  // 右操作数st.pop();int leftOperand = st.top();  // 左操作数st.pop();
​switch (s[0]){case '+':st.push(leftOperand + rightOperand);break;case '-':st.push(leftOperand - rightOperand);break;case '*':st.push(leftOperand * rightOperand);break;case '/':st.push(leftOperand / rightOperand);break;}}else{st.push(stoi(s));}}return st.top();}
};

由于栈中只保存操作数,操作符不需要保存到栈中,因此上述代码创建的是一个整数型栈。上述代码逐一扫描后缀表达式数组中的每个字符串,如果遇到的是一个操作数,则将其入栈;如果遇到的是一个操作符,则两个操作数出栈并执行相应的运算,然后计算结果入栈

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

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

相关文章

MySQL基础查询篇(7)-常用的字符串函数

MySQL数据库是目前广泛应用于各种系统中的一种关系型数据库管理系统。在MySQL中&#xff0c;有许多常见的字符串函数&#xff0c;可以对字符串进行各种处理和操作。本文将介绍MySQL数据库中常用的一些字符串函数&#xff0c;并提供详细示例。 CONCAT函数&#xff1a;用于将两个…

小项目:蓝牙模块点亮RGB三色灯

在之前的教程中&#xff0c;我们学习了蓝牙模块的原理&#xff0c;并动手写了驱动&#xff0c;实现了串口的接收和发送。本次我们就来教大家如何使用蓝牙串口控制灯。这是一个简单的示例&#xff0c;展示了如何将蓝牙通信与硬件控制相结合&#xff0c;实现远程控制的功能。你也…

vue3+vite+ts 配置commit强制码提交规范配置 commitlint

配置 git 提交时的 commit 信息&#xff0c;统一提交 git 提交规范 安装命令: npm install -g commitizen npm i cz-customizable npm i commitlint/config-conventional commitlint/cli -D 文件配置 根路径创建文件 commitlint.config.js module.exports {// 继承的规…

tsgctf-2021-lkgit-无锁竞争-userfaultfd

启动脚本 qemu-system-x86_64 \-kernel ./bzImage \-initrd ./rootfs.cpio \-nographic \-monitor /dev/null \-cpu kvm64,smep,smap \-append "consolettyS0 kaslr oopspanic panic1 quiet" \-no-reboot \-m 256M题目 lkgit_hash_object #define HASH_SIZE …

【Linux】进程学习(一):基本认识

目录 1.基本概念2.初步理解3.描述进程-PCB3.1task_struct-PCB的一种3.2task_ struct内容分类 4.组织进程5.查看进程5.1通过ps指令查看5.2通过系统目录查看 6.通过系统调用获取进程的PID和PPID7.通过系统调用创建进程-fork初识 1.基本概念 课本概念&#xff1a;程序的一个执行实…

QGIS介绍

一.基本概念 QGIS的官方网站为&#xff1a;https://www.qgis.org Github地址&#xff1a;https://github.com/qgis/QGIS QGIS采用开源证书GNU GPLv2 (GNU General Public License version 2&#xff09;发布&#xff0c;主要采用C语言开发&#xff0c;用户界面依赖Qt平台。 二…

PlantUML绘制UML图教程

UML&#xff08;Unified Modeling Language&#xff09;是一种通用的建模语言&#xff0c;广泛用于软件开发中对系统进行可视化建模。PlantUML是一款强大的工具&#xff0c;通过简单的文本描述&#xff0c;能够生成UML图&#xff0c;包括类图、时序图、用例图等。PlantUML是一款…

【Linux】线程

线程 我们常常会在linux中或者在操作系统这门课中听到进程和线程的名称&#xff0c;我们之前认识了进程的概念&#xff0c;现在我们来了解一下线程的概念 线程概念&#xff1a; 什么是线程 在一个程序里的一个执行路线就叫做线程&#xff08;thread&#xff09;。更准确的定…

Linux命令-base64命令(编码/解码文件或标准输入输出)

说明 base64将 文件 或 标准输入 编码或解码为标准输出; 语法 base64 [OPTION]... [FILE]参数 -d, --decode # 解码 -i, --ignore-garbage # 解码时&#xff0c;忽略非字母字符 -w, --wrapCOLS # 在指定的字符数后自动换行(默认为76), 0 为禁用自动换行--help # 显示此帮助…

k8s 部署java应用 基于ingress+jar包

k8 集群ingress的访问模式 先部署一个namespace 命名空间 vim namespace.yaml kind: Namespace apiVersion: v1 metadata:name: ingress-testlabels:env: ingress-test 在部署deployment deployment是pod层一层封装。可以实现多节点部署 资源分配 回滚部署等方式。 部署的…

牛客网SQL进阶127: 月总刷题数和日均刷题数

官网链接&#xff1a; 月总刷题数和日均刷题数_牛客题霸_牛客网现有一张题目练习记录表practice_record&#xff0c;示例内容如下&#xff1a;。题目来自【牛客题霸】https://www.nowcoder.com/practice/f6b4770f453d4163acc419e3d19e6746?tpId240 0 问题描述 基于练习记录表…

OpenAI使用的海量数据集介绍

1. OpenAI使用的数据 OpenAI为了训练其尖端的自然语言处理模型&#xff0c;如GPT-4&#xff0c;采用了极为庞大的数据集。虽然具体的细节可能不完全公开&#xff0c;但我们可以根据历史信息和公开报道推测&#xff0c;这些数据集通常包含&#xff1a; WebText&#xff1a;早期…

ComfyUI 学习笔记

目录 ComfyUI 入门教程 什么是ComfyUI&#xff1f; windows安装教程&#xff1a; 组件技巧学习 ComfyUI 入门教程 老V带你学comfyUI-基础入门 - 知乎 什么是ComfyUI&#xff1f; ComfyUI 是一个基于节点的 GUI&#xff0c;用于Stable Diffusion。你可以通过将不同的no…

conda创建环境,查看环境,激活环境,查看包,复制环境,删除环境,查看cuda版本,查看pytorch版本

创建环境 conda create --name [yourEnvname]查看环境 conda env list首次激活 conda 虚拟环境&#xff0c;使用source activate激活&#xff0c;以后可以使用 conda activate 激活虚拟环境 source activate [yourEnvname]激活环境 conda activate [yourEnvname]查看环境下…

基于SSM的图书馆预约占座系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的图书馆预约占座系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring…

java基础(2) 面向对象编程-java核心类

面向对象 面向对象对应的就是面向过程&#xff0c; 面向过程就是一步一步去操作&#xff0c;你需要知道每一步的步骤。 面向对象的编程以对象为核心&#xff0c;通过定义类描述实体及其行为&#xff0c;并且支持继承、封装和多态等特性 面向对象基础 面向对象编程&#xff0…

HARRYPOTTER: FAWKES

攻击机 192.168.223.128 目标机192.168.223.143 主机发现 nmap -sP 192.168.223.0/24 端口扫描 nmap -sV -p- -A 192.168.223.143 开启了21 22 80 2222 9898 五个端口&#xff0c;其中21端口可以匿名FTP登录&#xff0c;好像有点说法,百度搜索一下发现可以用anonymous登录…

L1-088 静静的推荐

一、题目 二、解题思路 如果有的学生天梯赛成绩虽然与前一个人相同&#xff0c;但其参加过 PAT 考试&#xff0c;且成绩达到了该企业的面试分数线&#xff0c;则也可以接受——同一批次这样的人可以有多个&#xff01;&#xff01;&#xff01;如果 pta 分数不低于 175 &#…

智慧工地安全带识别检测系统-准确识别有无佩戴安全带-及时预警---豌豆云

安全带佩戴识别系统对视频监控画面开展实时分析识别。当视频画面出现工作员未佩戴安全带时&#xff0c;安全带佩戴识别系统主动触发告警提示&#xff0c;并通过短信、邮件、报警语音等方式进行通知。 安全带是建筑工地的作业人员工作必备的安全防护设备&#xff0c;按标准佩戴…

QT初始程序

#include "widget.h"#include <QApplication>int main(int argc, char *argv[]){QApplication a(argc, argv);Widget w;w.show();return a.exec();} 解释&#xff1a; Qt系统提供的类头文件没有.h后缀Qt一个类对应一个头文件&#xff0c;类名和头文件名一致QA…