代码随想录算法训练营第11天

今日刷题3道:20. 有效的括号,1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值

●  20. 有效的括号

题目链接/文章讲解/视频讲解:https://programmercarl.com/0020.%E6%9C%89%E6%95%88%E7%9A%84%E6%8B%AC%E5%8F%B7.html

 碎碎念:主要考虑三种情况,左括号多,左右括号不匹配,右括号多,解题技巧是在匹配左括号的时候,让对应的右括号先入栈,就只需要比较当前元素和栈顶相不相等就可以了,比左括号先入栈代码实现要简单的多了!

class Solution {
public:
    stack<char> sk;
    bool isValid(string s) {
        if(s.size()%2==1) return false;
        for(int i=0;i<s.size();i++){
            if(s[i]=='(') sk.push(')');
            else if(s[i]=='[') sk.push(']');
            else if(s[i]=='{') sk.push('}');
            else if(!sk.empty()&&s[i]==sk.top()){
                sk.pop();
            }
            else{
                return false;
            }

        }
        return sk.empty();
    }
};

●  1047. 删除字符串中的所有相邻重复项

题目链接/文章讲解/视频讲解:https://programmercarl.com/1047.%E5%88%A0%E9%99%A4%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B8%AD%E7%9A%84%E6%89%80%E6%9C%89%E7%9B%B8%E9%82%BB%E9%87%8D%E5%A4%8D%E9%A1%B9.html

 碎碎念:用栈来存放已经遍历过的元素,当遍历当前的这个元素的时候,去栈里看一下我们是不是遍历过相同数值的相邻元素,若有,则从栈中删除,最后拼成字符串,逆置一下栈中元素即可。

class Solution {
public:
    string removeDuplicates(string s) {
        stack<char> sk;
        for(char ss : s){
            if(sk.empty() || ss != sk.top()){
                sk.push(ss);
            }
            else{
                sk.pop();
            }
        }      
        string st = "";
        while(!sk.empty()){
            st += sk.top();
            sk.pop();
        }
        reverse(st.begin(),st.end());
        return st;
    }
};
也可以用字符串去模拟栈,因为用栈的话还要转为字符串并逆置。
class Solution {
public:
    string removeDuplicates(string s) {
        string st = "";
        for(char ss : s){
            if(st.empty() || ss != st.back()){   //s.back()是取字符串的最后一个元素
                st.push_back(ss);   //s.push_back()是添加到字符串的末尾
            }
            else{
                st.pop_back();     //删除末尾元素
            }
        }      
        return st;
    }
};

●  150. 逆波兰表达式求值

题目链接/文章讲解/视频讲解:https://programmercarl.com/0150.%E9%80%86%E6%B3%A2%E5%85%B0%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%B1%82%E5%80%BC.html

 碎碎念:逆波兰表达式相当于是二叉树中的后序遍历。可以用栈解决,遍历字符串,若是数字则进栈。若是运算符则出栈两个元素,再把二者的运算结果压入栈即可,数值很大,需要用long long型,然后还要注意是nums2-nums1。

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<long long> sk;
        for(int i=0;i<tokens.size();i++){
            if(tokens[i]=="+" || tokens[i]=="-" || tokens[i]=="*" || tokens[i]=="/"){
                long long nums1=sk.top();sk.pop();
                long long nums2=sk.top();sk.pop();
                if(tokens[i]=="+") sk.push(nums2+nums1);
                if(tokens[i]=="-") sk.push(nums2-nums1);
                if(tokens[i]=="*") sk.push(nums2*nums1);
                if(tokens[i]=="/") sk.push(nums2/nums1);
            }
            else{
                sk.push(stoll(tokens[i])); //stoll()此函数将在函数调用中作为参数提供的字符串转换为long long int。它解析str并将其内容解释为指定基数的整数,并将其作为long long int类型的值返回。
            }
        }
        return sk.top();
    }
};
posted @ 2023-01-07 19:37  要坚持刷题啊  阅读(40)  评论(0)    收藏  举报