Problem: 150. 逆波兰表达式求值
思路
本体就是后缀表达式,遍历字符串,如果为数字就直接添加到栈中,如果为操作符,就从栈中弹出两个数字之后,执行运算。
解题方法
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;
}
};