「代码随想录算法训练营」第十天 | 栈与队列 part2
150. 逆波兰表达式求值
题目链接:https://leetcode.cn/problems/evaluate-reverse-polish-notation/
题目难度:中等
文章讲解:https://programmercarl.com/0150.逆波兰表达式求值.html
视频讲解:https://www.bilibili.com/video/BV1kd4y1o7on
题目状态:多次修改 bug 后通过
个人思路:
通过栈进行解决。
先判断队列中的元素是否为数字类型。若为数字类型,压入栈;若不是数字类型,则肯定是运算符,使用switch
结构进行运算,将栈中的头两个元素弹出,进行运算符运算,运算后将结果在压入栈中。最后返回栈顶元素。
修改 bug 的过程:
- 栈的空间:当栈内有两个或两个以上的元素的时候才能进行运算符运算。
- 符号判断:在判断队列元素是否为数字的时候,忘记还有负数这一项,需要先判断元素的第一个元素是否为
-
且元素是否含有多个元素,若是,则从元素中的下一个元素判断是否为数字;若不是,则直接判断。
代码实现:
class Solution {
public:
bool isNum(const string &s) {
if(s[0] == '-' && s.size() > 1) {
for(int i = 1; i < s.size(); ++i) {
if(!isdigit(s[i])) return false;
}
} else if(s[0] == '-' && s.size() == 1) {
return false;
} else {
for(auto &elem: s) {
if(!isdigit(elem)) return false;
}
}
return !s.empty();
}
int evalRPN(vector<string>& tokens) {
stack<int> st;
for(auto &token: tokens) {
if(isNum(token)) {
st.push(stoi(token));
}
else if(!st.empty() && st.size() >= 2){
int op1 = st.top(); st.pop();
int op2 = st.top(); st.pop();
int res = 0;
switch(token[0]) {
case '+': res = op2 + op1; break;
case '-': res = op2 - op1; break;
case '*': res = op2 * op1; break;
case '/': res = op2 / op1; break;
}
st.push(res);
}
}
return st.top();
}
};