解题思路🎯:
顺序遍历字符串数组,遇到数字入栈,遇到运算符:弹出栈顶元素和次顶元素计算并将计算结果入栈;最后返回栈顶元素
以下分别是Java代码和C++代码的实现
class Solution {
public int evalRPN(String[] tokens) {
Stack<Integer> res=new Stack<>();
for(int i=0;i<tokens.length;i++){
if("+-*/".contains(tokens[i])){
int n1=res.pop();
//res.pop();
int n2=res.pop();
//res.pop();
int ans=cal(tokens[i],n1,n2);
res.push(ans);
}else{
//说明是数字
res.push(Integer.parseInt(tokens[i]));
}
}
return res.peek();
}
public int cal(String c,int n1,int n2){
int ret=0;
switch(c){
case "+":
ret=n1+n2;
break;
case "*":
ret=n1*n2;
break;
case "/":
ret=n2/n1;
break;
case "-":
ret=n2-n1;
break;
}
return ret;
}
}
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<int> res;
string oper="+-*/";
for(auto s:tokens){
if(oper.find(s)<oper.size()){
//说明是运算符
int n1=res.top();
res.pop();
int n2=res.top();
res.pop();
int ans=cal(s,n1,n2);
res.push(ans);
}else{
res.push(std::stoi(s));
}
}
return res.top();
}
int cal(string oper,int n1,int n2){
if(oper=="+") return n1+n2;
else if(oper=="-") return n2-n1;
else if(oper=="*") return n2*n1;
else return n2/n1;
}
};