算法思路
- 准备一个
栈
,从左向右
扫描后缀表达式。 - 遇到操作数就入栈,遇到运算符则出栈两个操作数,
先出栈
的作为右操作数
,后出栈
的作为左操作数
,然后运算之后把结果继续压入栈内 重复以上步骤
,最后栈中的栈顶元素就是最终计算结果
代码实现
#include <iostream>
#include <stack>
#include <vector>
using namespace std;
class Solution {
public:
void calculate(int& opnd1, string& op, int& opnd2, int& result);
int evalRPN(vector<string>& tokens);
};
void Solution::calculate(int& opnd1, string& op, int& opnd2, int& result) {
if (op == "+") {
result = opnd1 + opnd2;
}
if (op == "-") {
result = opnd1 - opnd2;
}
if (op == "*") {
result = opnd1 * opnd2;
}
if (op == "/") {
result = opnd1 / opnd2;
}
}
int Solution::evalRPN(vector<string>& tokens) {
stack<int> ret;
for (int i = 0; i < tokens.size(); i++) {
if (tokens[i].size() == 1 && (tokens[i] == "+") || tokens[i] == "-" ||
tokens[i] == "*" || tokens[i] == "/") {
int opnd1, opnd2, result;
string op;
op = tokens[i];
opnd2 = ret.top();
ret.pop();
opnd1 = ret.top();
ret.pop();
calculate(opnd1, op, opnd2, result);
ret.push(result);
} else {
int temp = atoi(tokens[i].c_str());
ret.push(temp);
}
}
return ret.top();
}