【代码随想录】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类型字符串。


目录
相关文章
|
7月前
|
存储 算法 C语言
C语言编程—中缀表达式转换为后缀表达式
1.创建栈 2.从左向右顺序获取中缀表达式 a.数字直接输出 b.运算符 情况一:遇到左括号直接入栈,遇到右括号将栈中左括号之后入栈的运算符全部弹栈输出,同时左括号出栈但是不输出。 情况二:遇到乘号和除号直接入栈,直到遇到优先级比它更低的运算符,依次弹栈。 情况三:遇到加号和减号,如果此时栈空,则直接入栈,否则,将栈中优先级高的运算符依次弹栈(注意:加号和减号属于同一个优先级,所以也依次弹栈)直到栈空或则遇到左括号为止,停止弹栈。(因为左括号要匹配右括号时才弹出)。 情况四:获取完后,将栈中剩余的运算符号依次弹栈输出 例:将:2*(9+6/3-5)+4转化为后缀表达式 2 9
|
2月前
【LeetCode 25】150.逆波兰表达式求值
【LeetCode 25】150.逆波兰表达式求值
13 0
|
6月前
|
C++
【洛谷 P1739】表达式括号匹配 题解(栈)
该编程题目要求检查给定的包含字母、运算符和括号的表达式是否括号匹配。输入为一行表达式,以`@`结束。如果括号匹配,输出`YES`,否则输出`NO`。样例包括一个匹配和一个不匹配的表达式。解决方案是使用栈,遇到左括号入栈,遇到右括号时判断栈是否为空,栈空则输出`NO`,否则出栈。当读到`@`时,栈空则输出`YES`,否则输出`NO`。提供的AC代码使用C++实现,通过`stack`处理括号匹配。
83 0
|
7月前
|
索引
【力扣刷题】数组实现栈、后缀表达式(逆波兰表达式)求值、中缀表达式转换为后缀表达式(无括号&&有括号)
【力扣刷题】数组实现栈、后缀表达式(逆波兰表达式)求值、中缀表达式转换为后缀表达式(无括号&&有括号)
59 0
|
7月前
leetcode代码记录(逆波兰表达式求值
leetcode代码记录(逆波兰表达式求值
41 0
|
7月前
|
C++ Python Java
Python每日一练(20230422) 杨辉三角、最长回文子串、逆波兰表达式求值
Python每日一练(20230422) 杨辉三角、最长回文子串、逆波兰表达式求值
32 0
Python每日一练(20230422) 杨辉三角、最长回文子串、逆波兰表达式求值
|
7月前
|
Java C++ Python
leetcode-150:逆波兰表达式求值
leetcode-150:逆波兰表达式求值
41 0
|
7月前
|
存储
【例题】逆波兰表达式求值(图解+代码)
【例题】逆波兰表达式求值(图解+代码)
198 0
|
存储 算法
每日一题——逆波兰表达式求值(前缀、中缀、后缀表达式的说明,库函数atoi()的解析)
每日一题——逆波兰表达式求值(前缀、中缀、后缀表达式的说明,库函数atoi()的解析)
LeetCode 150 逆波兰表达式求值
构造一个栈,遇到运算符就弹出进行运算