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();}
};