代码随想录Day11 |● 20. 有效的括号● 1047. 删除字符串中的所有相邻重复项● 150. 逆波兰表达式求值

今天的题目都很简单,我全部都写出来了,来看题目吧,都是栈的具体应用

20. 有效的括号:代码随想录

这道题就是问你给你的这一串括号字符串是否是有效的,也就是是否都能匹配,这样的问题额我们就可以用栈来解决,我们只要遇到左括号就将它加入到栈里,遇到右括号就将栈顶的元素弹出,看是否与当前的右括号匹配,如果不匹配,就返回false,然后再所有字符遍历完后,再来栈是否为空,如果为空,就代表有多余的元素,就返回false,来看具具体的代码的实现

class Solution {
public:
    bool isValid(string s) {
        stack<int> st;bool flag=true;
       for(int i=0;i<s.size();i++){
            if(s[i]=='('|| s[i]=='[' || s[i]=='{'){
                st.push(s[i]);
            }
            else if(s[i]=='}'){
                if(st.empty()==false){
                    if(st.top()!='{'){
                        flag=false;
                        break;
                    }
                    else{
                        st.pop();
                    }
                }
                else{
                    flag=false;
                    break;
                }
            }
            else if(s[i]==']'){
                if(st.empty()==false){
                    if(st.top()!='['){
                        flag=false;
                        break;
                    }
                    else{
                        st.pop();
                    }
                }
                else{
                    flag=false;
                    break;
                }
            }
            else if(s[i]==')'){
                if(st.empty()==false){
                if(st.top()!='('){
                    flag=false;
                    break;
                }
                else{
                    st.pop();
                }
                }
                else{
                    flag=false;
                    break;
                }
            }
        }
        if(flag==true){
            if(st.empty()==false){
                flag=false;
            }
        }
        return flag;
    }
};

我的代码写的比较冗余,大家想看精简版本的代码,可以去代码随想录的网站上去看,我在上面粘贴了网址,再来看下一道题

1047. 删除字符串中的所有相邻重复项:代码随想录

这道题目的意思就是给你一个字符串,让你删除两个元素,这两个元素需要满足的条件是必须是相邻的两个元素,而且必须元素的值相同,这样的一道题,我们也可以用栈来实现,我们用栈来记录我们遍历过的元素,每次取到字符串里的元素的时候,就将它与栈里的元素进行比较,如果相同,就将栈里的元素弹出,然后继续比较,不相同或者是栈为空的情况,就将当前元素加入到栈中,然后一直遍历直到循环结束,下面来看具体代码的实现

class Solution {
public:
    string removeDuplicates(string s) {
        stack<char> st;
        for(int i=0;i<s.size();i++){
            if(st.empty()==false){
                if(s[i]==st.top()){
                    st.pop();
                }
                else{
                    st.push(s[i]);
                }
            }
            else st.push(s[i]);
        }
        string t;
        while(st.empty()==false){
            t=st.top()+t;
            st.pop();
        }
        return t;
    }
};

这就是具体的代码的实现,然后这里需要注意的一点就是最后栈里保存的元素是倒过来的,所以我们要重新定义一个string,然后不断将栈里的元素加入到字符串中,最后返回字符串即可

来看下一道题目

150. 逆波兰表达式求值:代码随想录

这道题目的意思就是,给你一个式子的后缀表达式,让你求出该表达式的结果,很明显这题要用栈来实现,具体的方法就是遍历这个字符串数组,只要一遇到数字字符串就将其加入到栈中,如果遇到运算符的话就将栈里的元素取出来两个,算完之后在加入到栈里,直到数组遍历完,在返回栈顶元素就可以了,下面来看具体代码的实现,

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<int> st;
        for(int i=0;i<tokens.size();i++){
            if(tokens[i]!="-" &&tokens[i]!="+" &&tokens[i]!="*" &&tokens[i]!="/"){
                int a=f(tokens[i]);
                st.push(a);
            }
            else{
                int a=st.top();st.pop();
                int b=st.top();st.pop();
                int c=Calculate(tokens[i],b,a);
                st.push(c);
            }
        }
        return st.top();
    }
    int f(string s){
        int sum;
        if(s[0]=='-'){
            s=s.substr(1);
            sum=0;int c=1;
            for(int i=s.size()-1;i>=0;i--){
                sum+=(s[i]-'0')*c;
                c*=10;
            }
            sum=0-sum;
        }
        else{
            sum=0;int c=1;
            for(int i=s.size()-1;i>=0;i--){
                sum+=(s[i]-'0')*c;
                c*=10;
            }
        }
        return sum;
    }
    int Calculate(string s, int a, int b){
        if(s=="+"){
            return a+b;
        }
        else if(s=="-"){
            return a-b;
        }
        else if(s=="*"){
            return a*b;
        }
        else if(s=="/"){
            return a/b;
        }
        return -1;
    }
};

这里将字符串转化为数字,我另外用了一个函数,注意区分正数和负数两种情况,这就是今天的题目,因为我之前写过类似的题,所以今天的对于我来说就没啥挑战性,加油吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值