首页 > 编程语言 >「代码随想录算法训练营」第十天 | 栈与队列 part2

「代码随想录算法训练营」第十天 | 栈与队列 part2

时间:2024-07-13 10:53:46浏览次数:17  
标签:return 第十天 op2 res 元素 随想录 st part2 op1

150. 逆波兰表达式求值

题目链接:https://leetcode.cn/problems/evaluate-reverse-polish-notation/
题目难度:中等
文章讲解:https://programmercarl.com/0150.逆波兰表达式求值.html
视频讲解:https://www.bilibili.com/video/BV1kd4y1o7on
题目状态:多次修改 bug 后通过

个人思路:

通过进行解决。
先判断队列中的元素是否为数字类型。若为数字类型,压入栈;若不是数字类型,则肯定是运算符,使用switch结构进行运算,将栈中的头两个元素弹出,进行运算符运算,运算后将结果在压入栈中。最后返回栈顶元素。

修改 bug 的过程

  1. 栈的空间:当栈内有两个或两个以上的元素的时候才能进行运算符运算。
  2. 符号判断:在判断队列元素是否为数字的时候,忘记还有负数这一项,需要先判断元素的第一个元素是否为-且元素是否含有多个元素,若是,则从元素中的下一个元素判断是否为数字;若不是,则直接判断。

代码实现:

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

标签:return,第十天,op2,res,元素,随想录,st,part2,op1
From: https://www.cnblogs.com/frontpen/p/18299768

相关文章