逆波兰表达式(后缀表达式):
class Solution {
public:
int evalRPN(vector<string>& tokens) {
vector<long long> ve;
for(int i=0; i<tokens.size(); i++){
if(tokens[i]=="+" || tokens[i]=="-" || tokens[i]=="*" || tokens[i]=="/"){
long long num1 = ve.back();
ve.pop_back();
long long num2 = ve.back();
ve.pop_back();
if(tokens[i]=="+") ve.push_back(num2+num1);
if(tokens[i]=="-") ve.push_back(num2-num1);
if(tokens[i]=="*") ve.push_back(num2*num1);
if(tokens[i]=="/") ve.push_back(num2/num1);
}else{
ve.push_back(stoll(tokens[i]));
}
}
long long res = ve.back();
ve.pop_back();
return res;
}
};
前缀表达式:
class Solution {
public:
int evalPrefix(vector<string>& tokens) {
vector<long long> ve;
// 从右往左遍历 tokens
for (int i = tokens.size() - 1; i >= 0; --i) {
if (tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/") {
// 弹出两个操作数
long long num1 = ve.back(); ve.pop_back();
long long num2 = ve.back(); ve.pop_back();
if (tokens[i] == "+") ve.push_back(num1 + num2);
else if (tokens[i] == "-") ve.push_back(num1 - num2);
else if (tokens[i] == "*") ve.push_back(num1 * num2);
else if (tokens[i] == "/") ve.push_back(num1 / num2);
} else {
ve.push_back(stoll(tokens[i]));
}
}
return ve.back(); // 最后结果
}
};