问题描述
计算逆波兰式(后缀表达式)的值
运算符仅包含"+","-","*“和”/",被操作数可能是整数或其他表达式
例如:
[“2”, “1”, “+”, “3”, “*”] -> ((2 + 1) * 3) -> 9↵ [“4”, “13”, “5”, “/”, “+”] -> (4 + (13 / 5)) -> 6
解法
使用栈,数字入栈,遇到符号出栈计算再入栈。
#include <stack>
using namespace std;
class Solution {
public:
int evalRPN(vector<string> &tokens) {
stack <int> s;
int size = tokens.size();
for(int i = 0;i<size;i++){
string temp = tokens[i];
if(temp=="+"){
int a = s.top();
s.pop();
int b = s.top();
s.pop();
s.push(a+b);
}
else{
if(temp=="-"){
int a = s.top();
s.pop();
int b = s.top();
s.pop();
s.push(b-a);
}
else{
if(temp=="*"){
int a = s.top();
s.pop();
int b = s.top();
s.pop();
s.push(a*b);
}
else{
if(temp=="/"){
int a = s.top();
s.pop();
int b = s.top();
if(a==0)return 0;
s.pop();
s.push(b/a);
}
else{
s.push(stoi(temp));
}
}
}
}
}
return s.top();
}
};
注意出栈的顺序与入栈的顺序相反。
另外,这个代码里有大量重复的取数操作,可以优化。