每道题的方法:
最后总结写
题目一链接:150. 逆波兰表达式求值 - 力扣(LeetCode)
思路:如果当前字符串是算术运算符,则取出栈中两个元素进行运算,否则将数字字符串压入栈中
代码:
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<long long> st;//过程中的数值可能很大所以需要<ll>类型的
for(int i = 0;i < tokens.size();i ++) {
//注意st里面都是字符串,所以不能用字符判断0到9
if(tokens[i] == "+" || tokens[i] == "—" || tokens[i] == "*" || tokens[i] == "/") {
long long nums1 = st.top();
st.pop();
long long nums2 = st.top();
st.pop();
//注意弹出来的两个数的计算顺序,nums2/nums1
if(tokens[i] == "+") {
//算术运算符可以将字符串自动转化为数字
st.push(nums2 + nums1);
}
if(tokens[i] == "-") {
st.push(nums2 - nums1);
}
if(tokens[i] == "*") {
st.push(nums2 * nums1);
}
if(tokens[i] == "/") {
st.push(nums2 / nums1);
}
}
else {
//将字符串转化为数字的操作
st.push(stoll(tokens[i]));
}
}
long long result = st.top();
return result;
}
};
难点:
解释细节1:因为此题的容器是字符串数组,所以不能用单纯的字符相等来做,而是字符串相等
解释细节2:用后面的数除前面的数
解释细节3:算术运算符可以自动将字符串转化为数字
解释细节4:因为它本身是字符串而不是数字,所以要用stoll转化
额外细节:存储运算结果的数据类型需要是long long