【算法与数据结构】150、LeetCode逆波兰表达式求值

news2024/10/7 10:25:55

文章目录

  • 一、题目
  • 二、解法
  • 三、完整代码

所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。

一、题目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、解法

  思路分析:我们常看见的表达式是中缀表达式(关于中缀表达式的定义可以参考前缀、中缀、后缀表达式),中缀表达式比较符合我们的习惯,但对于计算机来说不是特别友好:计算机需要从左到右扫描,然后还有比较优先级,做完部分运算后还可能要回退。那么将中缀表达式,转化为后缀表达式之后,就不一样了,计算机可以利用栈来顺序处理,不需要考虑优先级了。也不用回退了, 所以后缀表达式对计算机来说是非常友好的。程序当中用到的stoll函数,用来将字符串转成int类型。
  程序如下

class Solution {
public:
	int evalRPN(vector<string>& tokens) {
		stack<int> st;
		int num1 = 0, num2 = 0;
		for (int i = 0; i < tokens.size(); ++i) {
			if (tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "/" || tokens[i] == "*") {
				num1 = st.top();
				st.pop();
				num2 = st.top();
				st.pop();
				if (tokens[i] == "+") st.push(num1 + num2);
				else if (tokens[i] == "-") st.push(num2 - num1);
				else if (tokens[i] == "/") st.push(ceil(num2 / num1));	
				else st.push(num1 * num2);
			}
			else {
				st.push(stoll(tokens[i]));
			}
		}
		return st.top();
	}
};

复杂度分析:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)

三、完整代码

# include <iostream>
# include <stack>
# include <string>
# include <vector>
# include <cmath>
using namespace std;

class Solution {
public:
	int evalRPN(vector<string>& tokens) {
		stack<long long> st;
		long long num1 = 0, num2 = 0;
		for (int i = 0; i < tokens.size(); ++i) {
			if (tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "/" || tokens[i] == "*") {
				num1 = st.top();
				st.pop();
				num2 = st.top();
				st.pop();
				if (tokens[i] == "+") st.push(num1 + num2);
				else if (tokens[i] == "-") st.push(num2 - num1);
				else if (tokens[i] == "/") st.push(ceil(num2 / num1));	
				else st.push(num1 * num2);
			}
			else {
				st.push(stoll(tokens[i]));
			}
		}
		return st.top();
	}
};

int main()
{
	Solution s1;
	//vector<string> v = { "2", "1", "+", "3", "*" };
	vector<string> v = { "10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+" };	
	//vector<string> v = { "4", "13", "5", "/", "+" };	
	int result = s1.evalRPN(v);
	cout << "result = " << result <<endl;
	system("pause");
	return 0;
}

end

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

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

相关文章

0经验也能轻松设计商标logo的方法

如今&#xff0c;越来越多的人开始创业&#xff0c;而拥有一个好看的商标就显得尤为重要。但是&#xff0c;很多人并不具备设计技能&#xff0c;对于商标设计也是一头雾水。不过&#xff0c;现在有了一键logo设计应用&#xff0c;即使零经验的人也能轻松设计出自己满意的商标。…

IoT开发者为王,涂鸦智能硬核“靠边站”

文 | 智能相对论 作者 | 沈浪 6月底&#xff0c;全球化IoT开发平台服务商涂鸦智能开了个TUYA开发者大会&#xff0c;面向行业传达了两个关键的信息点&#xff1a; 1. 当前IoT领域的行业竞争不再局限于技术、渠道的单一纬度&#xff0c;开始演化为整体的生态之争。 2. 紧随行…

STM32 Proteus仿真双机串口通讯同步电子时钟系统数码管显示 -0060

STM32 Proteus仿真双机串口通讯同步电子时钟系统数码管显示 -0060 Proteus仿真小实验&#xff1a; STM32 Proteus仿真双机串口通讯同步电子时钟系统数码管显示 -0060 功能&#xff1a; 硬件组成&#xff1a;本系统由2个设备组成 设备1&#xff1a;STM32F103R6单片机 8位数…

GaussDB OLTP云数据库配套工具DRS

目录 一、前言 二、DRS定义与使用场景 1、DRS定义 2、DRS场景示意图 三、DRS核心功能 1、实时迁移管理 2、实时同步管理 3、备份迁移管理 4、数据订阅管理 5、实时灾备管理 四、小结 一、前言 华为GaussDB云数据库提供了配套的生态工具数据复制服务DRS。 DRS围绕云…

IO流学习09(Java)

解压缩流/压缩流&#xff1a; 解压缩流&#xff1a; 解压本质&#xff1a;把每一个ZipEntry按照层级拷贝到本地另一个文件夹中 注&#xff1a;Java只认zip格式 在正式写之前&#xff0c;先准备好压缩文件和解压完需要存放文件的文件夹 下面直接给出案例&#xff1a; pack…

步进电机的MATLAB仿真程序分享(采用了卡尔曼滤波,对定子电流进行估计,并估算出转子的位置和速度)

两相步进电机的连续时间延长卡尔曼滤波器仿真&#xff0c; 根据定子电流的噪声测量&#xff0c;估计定子电流以及转子位置和速度。 主程序&#xff1a; function MotorKalman % 两相步进电机的连续时间延长卡尔曼滤波器仿真 % 根据定子电流的噪声测量&#xff0c;估计定子电…

为什么InnoDB存储引擎选择使用B+tree索引结构?

&#x1f389;&#x1f389;&#x1f389;&#x1f389;&#x1f389;&#x1f389;&#x1f389;&#x1f389;&#x1f389;&#x1f389;&#x1f389;&#x1f389;&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389;&#x1f389;&#x1f389;&#x1f389;&…

CS231W assignment3 RNN

对作业进行一些形象的解释 首先是def rnn_step_forward&#xff1a; 这里的t时刻其实就是一个句子里面的单词数&#xff0c;为了方便会统一到一个最长长度&#xff0c;对于比这个长度短的部分用null进行填充&#xff0c;并且在方法内部会让Null不进行传播和梯度计算。 我们最…

Simpleitk简单应用-python版本

安装: pip install simpletik读取 目前主流的医疗图像格式是nifti格式&#xff0c;相比于dicom格式更加简单和更加容易读取和操作。后缀名为nii或者nii.gz&#xff08;nii为原格式&#xff0c;gz结尾的是经过压缩格式&#xff0c;因为医疗图像的重复像素特别多&#xff0c;通…

【Hello mysql】 mysql的基本查询(二)

Mysql专栏&#xff1a;Mysql 本篇博客简介&#xff1a;介绍mysql的基本查询 mysql的基本查询&#xff08;二&#xff09; 将筛选出来的数据插入到数据库中&#xff08;insertselect&#xff09;聚合函数统计班级共有多少同学统计班级手机的qq号有多少统计本次考试去重的数学成绩…

Xcode doesn’t support iPhone’s iOS 15.7.3 (19H307).

Xcode真机调试时&#xff0c;出现了Xcode doesn’t support iPhone’s iOS 15.7.3 (19H307).&#xff0c;Xcode不支持iPhone的版本。升级Xcode太耗时&#xff0c;用了找支持SDK文件方式解决了此问题。下图是本地的SDK支持文件。 从GitHub下载了15.7的设备支持文件&#xff0c…

N-123基于springboot房屋租赁管理系统

开发工具&#xff1a;IDEA&#xff0c;jdk1.8 服务器&#xff1a;tomcat9.0 数据库&#xff1a;mysql5.7 前端&#xff1a;jsp、bootstrap 技术&#xff1a; springbootmybatis-plus 系统主要分前台和后台&#xff0c;分租客、房东、管理员三个角色 系统功能介绍说明&am…

19 动态库和静态库

文章目录 静态库动态库dll模块入口函数 静态库 选择桌面向导里面的静态库 设置为发布版,设置重新生成 创建文件夹放入库和头文件 将库放入工程目录下面 在属性中选择C/C附加包含目录&#xff0c;选择include 属性中链接器选择附加目录将lib选中 #include <stdio.h> #i…

八数码问题-c语言

八数码问题 每个局面是三行三列的数字方阵&#xff0c;每个位置为0-8的一个数码且互不相同&#xff0c;求从初始局面&#xff08;自己设定&#xff09;如何“最快”移动到终止局面&#xff08;自己设定&#xff09;。 移动规则&#xff1a;每次只能0与其上下左右四个方向相邻…

91. 解码方法

91. 解码方法 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a; 原题链接&#xff1a; 91. 解码方法 https://leetcode.cn/problems/decode-ways/ 完成情况&#xff1a; 解题思路&#xff1a; 参考代码&#xff1a; package 西湖算法题解…

LLM 与架构新纪元:适应代码生成模式,突破软件开发瓶颈

TL;DR 版本&#xff1a; 今年 2 月&#xff0c;我们在 QCon 上分享了《组织级架构治理的正确落地方式》&#xff0c;其背后的一个核心思想是&#xff1a;架构即代码。围绕这个核心思想&#xff0c;我们构建了 ArchGuard 的治理功能&#xff0c;即架构规范转换为代码。 今年 5 月…

【Qt QML入门】Rectangle

Rectangle是用来在QML窗口上绘制一个可带边框、和可填充的矩形局域。 如效果图&#xff1a; QML代码如下&#xff1a; import QtQuick 2.15 import QtQuick.Window 2.15Window {width: 640height: 480visible: truetitle: qsTr("Hello World")//绘制一个可填充的矩…

开源堡垒机Guacamole二次开发记录之一

简介 项目中需要用到堡垒机功能&#xff0c;调研了一大圈&#xff0c;发现了Apache Guacamole这个开源项目。 Apache Guacamole 是一个无客户端的远程桌面网关&#xff0c;它支持众多标准管理协议&#xff0c;例如 VNC(RFB)&#xff0c;RDP&#xff0c;SSH 等等。该项目是Apa…

LabVIEW-模拟传感器采集数据并预测数据

一、题目 已知某传感器过去的一段时间内采集的数据为d1,d2,d3,......,dn&#xff0c;现欲以m点的数据宽度&#xff0c;预测 tao 步后的数据值&#xff0c;即将一维的时间序列数据重构为如下m1列的形式&#xff1a; d(1) d(2 ) ....... d(m), d(mtao) d(2) d(…