

逆波兰表达式:是一种后缀表达式,所谓后缀就是指运算符写在后面。(对二叉树进行后序遍历)
适合用栈操作运算:遇到数字则入栈;遇到运算符则取出栈顶两个数字进行计算,并将结果压入栈中。
-
tokens[i]是std::string类型(因为tokens是vector<string>) -
'+'是char类型(单字符字面量) -
所以用 "+"
cpp
class Solution {
public:
int evalRPN(vector<string>& tokens) {
// 力扣修改了后台测试数据,需要用long long来避免整数溢出
stack<long long> st; // 使用栈存储运算的中间结果
for (int i = 0; i < tokens.size(); i++) {
// 判断当前token是否为运算符
if (tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/") {
// 如果是运算符,从栈顶取出两个操作数
// 注意顺序:先弹出的是第二个操作数(后入栈的)
long long num1 = st.top();
st.pop();
long long num2 = st.top();
st.pop();
// 根据运算符进行相应运算,注意操作数顺序
if (tokens[i] == "+") st.push(num2 + num1); // 加法
if (tokens[i] == "-") st.push(num2 - num1); // 减法(注意顺序)
if (tokens[i] == "*") st.push(num2 * num1); // 乘法
if (tokens[i] == "/") st.push(num2 / num1); // 整数除法
} else {
// 当前token是数字,将其转换为long long并入栈
// stoll: string to long long
st.push(stoll(tokens[i]));
}
}
// 栈中最后剩下的就是计算结果
long long result = st.top();
st.pop(); // 弹出栈顶元素(清理栈,虽然函数返回前不pop也可以)
return result; // 返回计算结果(隐式转换为int)
}
};