【代码随想录】LC 150. 逆波兰表达式求值

简介: 目录一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解 三、知识风暴字符串转数字,数字转字符串

一、题目

1、原题链接

力扣


2、题目描述

给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。


请你计算该表达式。返回一个表示表达式值的整数。


注意:

有效的算符为 '+'、'-'、'*' 和 '/' 。

每个操作数(运算对象)都可以是一个整数或者另一个表达式。

两个整数之间的除法总是 向零截断 。

表达式中不含除零运算。

输入是一个根据逆波兰表示法表示的算术表达式。

答案及所有中间计算结果可以用 32 位 整数表示。


示例 1:

输入:tokens = ["2","1","+","3","*"]

输出:9

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


示例 2:

输入:tokens = ["4","13","5","/","+"]

输出:6

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


示例 3:

输入:tokens = ["10","6","9","3","+","-11","*","/","*","17","+","5","+"]

输出:22

解释:该算式转化为常见的中缀算术表达式为:

 ((10 * (6 / ((9 + 3) * -11))) + 17) + 5

= ((10 * (6 / (12 * -11))) + 17) + 5

= ((10 * (6 / -132)) + 17) + 5

= ((10 * 0) + 17) + 5

= (0 + 17) + 5

= 17 + 5

= 22


提示:

1 <= tokens.length <= 104

tokens[i] 是一个算符("+"、"-"、"*" 或 "/"),或是在范围 [-200, 200] 内的一个整数


逆波兰表达式:

逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。


平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 ) 。

该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * ) 。

逆波兰表达式主要有以下两个优点:


去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。

适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中


二、解题报告

思路来源:栈的最后表演! | LeetCode:150. 逆波兰表达式求值_哔哩哔哩_bilibili


卡哥yyds


1、思路分析

1)可以利用栈来进行模拟。


2)如果遇到"+"、"-"、"*"、"/"这四种符号,就从栈中弹出两个元素进行相应的运算,然后将运算结果压入栈中,如果遇到数字就直接入栈,遍历完表达式后,返回栈顶元素即为所求。


3)注意:对于"/"和"-"不满足分配律,要注意数字运算时的位置,所以每当遇到符号需要运算时,我们需要把后弹出(即入栈时先进入的)的元素作为第一个运算数,将先弹出(即入栈时后进入的)的元素作为第二个运算数,这样就避免了该问题。


4)模拟上述过程,返回最终栈顶元素,即为所求。

2、时间复杂度

时间复杂度为O(n)


3、代码详解

class Solution {

public:

   int evalRPN(vector<string>& tokens) {

       stack<int> s;

       int num1,num2;

       for(int i=0;i<tokens.size();i++){

           if(tokens[i]=="*"||tokens[i]=="/"||tokens[i]=="-"||tokens[i]=="+"){

               num2=s.top();

               s.pop();

               num1=s.top();

               s.pop();

               if(tokens[i]=="+")

                   s.push(num1+num2);

               else if(tokens[i]=="-")

                   s.push(num1-num2);

               else if(tokens[i]=="*")

                   s.push(num1*num2);

               else if(tokens[i]=="/")

                   s.push(num1/num2);

           }

           else{

               s.push(stoi(tokens[i]));

           }      

       }

       return s.top();

   }

};


三、知识风暴

字符串转数字,数字转字符串

头文件#include <string>

stoi():将字符串转化为int类型,传入string类型字符串。

atoi():将字符串转化为int类型,传入char类型字符串。

to_string():将数字常量量转化为string类型字符串。


目录
相关文章
|
机器学习/深度学习 人工智能 前端开发
机器学习PAI常见问题之web ui 项目启动后页面打不开如何解决
PAI(平台为智能,Platform for Artificial Intelligence)是阿里云提供的一个全面的人工智能开发平台,旨在为开发者提供机器学习、深度学习等人工智能技术的模型训练、优化和部署服务。以下是PAI平台使用中的一些常见问题及其答案汇总,帮助用户解决在使用过程中遇到的问题。
|
7月前
|
人工智能 安全 数据挖掘
MedRAX:专注于胸部X光检查的AI医学推理智能体,帮助医生快速解读胸部X光片
MedRAX 是一款专门用于胸部X光检查的医学推理AI智能体,整合了多种最先进的分析工具,支持多模态推理和动态任务分解。
389 10
MedRAX:专注于胸部X光检查的AI医学推理智能体,帮助医生快速解读胸部X光片
|
4月前
|
人工智能 文字识别 小程序
告别手动录入!AI自动识别发票
最近有朋友向我吐槽:"每天对着几十张发票手动录入系统,眼睛都快看花了,还总担心数字打错。" 这种重复性高、容错率低的工作,确实让财务和行政人员苦不堪言。作为程序员,我深知这类场景完全可以通过技术手段优化
195 0
|
存储 Go
Golang深入浅出之-Go语言依赖管理:GOPATH与Go Modules
【4月更文挑战第27天】Go语言依赖管理从`GOPATH`进化到Go Modules。`GOPATH`时代,项目结构混乱,可通过设置多个工作空间管理。Go Modules自Go 1.11起提供更现代的管理方式,通过`go.mod`文件控制依赖。常见问题包括忘记更新`go.mod`、处理本地依赖和模块私有化,可使用`go mod tidy`、`replace`语句和`go mod vendor`解决。理解并掌握Go Modules对现代Go开发至关重要。
208 2
|
11月前
|
数据库
树的分类有哪些?
本文介绍了树的多种类型,包括二叉树、二叉搜索树、完全二叉树、AVL树、红黑树、B树和B+树,并解释了每种树的特点和用途。
435 0
树的分类有哪些?
|
12月前
详细教程:扫码提交表单后,数据直接推送到企业微信、钉钉、飞书群聊
在草料制作的表单中,填表人扫码填写并提交数据后,这些信息可以立即通过企业微信、钉钉或飞书自动推送到相应的群聊中,实现即时共享和沟通,提升团队协作效率。
412 2
|
SQL 开发框架 .NET
你确定不学?Go标准库之 text/template
你确定不学?Go标准库之 text/template
196 2
|
Python
【Python基础】reduce函数详解
【Python基础】reduce函数详解
1322 1
|
存储 算法 Go
ZIP文件实战指南:读写操作一网打尽
ZIP文件实战指南:读写操作一网打尽
1025 0