Problem: 150. 逆波兰表达式求值
文章目录
- 思路
- 解题方法
- 复杂度
- Code
思路
本体就是后缀表达式,遍历字符串,如果为数字就直接添加到栈中,如果为操作符,就从栈中弹出两个数字之后,执行运算。
解题方法
1.函数最后放回的是一个int形的结果,我们定义的是long long ,可以直接使用内置函数stoll(),来解决这个问题
2.假如后缀表达式为 [“4”,“13”,“5”,“/”,“+”]
栈顶 -------------------->栈底
13 4
则num1=13
num2=4
对于原式来说,应该执行的是num2+num1,而不是num1-num2
复杂度
时间复杂度:
遍历字符串向量 tokens 的时间复杂度为 O(N),其中 N 是字符串向量的长度。
在每次遍历过程中,我们进行了一系列操作:
检查当前字符串 ch 是否为运算符,这个操作的时间复杂度为 O(1)。
如果是运算符,我们从栈中弹出两个数进行计算,并将结果压入栈中,这个操作的时间复杂度为 O(1)。
如果不是运算符,我们将字符串转换为整数,并将其压入栈中,这个操作的时间复杂度为 O(1)。
因此,整个函数的时间复杂度为 O(N)。
空间复杂度:
我们定义了一个栈 sta 来存储数字,其空间取决于输入字符串向量 tokens 的长度以及栈的大小。
在最坏的情况下,当输入字符串向量 tokens 中的所有元素都是数字时,栈的大小将等于字符串向量的长度。因此,栈 sta 的空间复杂度为 O(N)。
另外,我们还定义了一个变量 res 来存储最终的结果,其空间复杂度为 O(1)。
因此,函数的总体空间复杂度为 O(N)。
Code
class Solution {
public:typedef long long ll;int evalRPN(vector<string>& tokens) {stack<ll> sta;for(string ch:tokens){// 如果是运算符就弹出两个数if(ch=="+" || ch=="-" ||ch=="*" || ch=="/"){ll num1=sta.top();sta.pop();ll num2=sta.top();sta.pop();if(ch=="+") sta.push(num2+num1);if(ch=="-") sta.push(num2-num1);if(ch=="*") sta.push(num2*num1);if(ch=="/") sta.push(num2/num1);}//不是运算符的话就加入到栈中else sta.push(stoll(ch));}ll res=sta.top();sta.pop();return res;}
};