LeetCode 20. Valid Parentheses【栈+括号匹配】

题目描述

在这里插入图片描述

知识点

字符串、栈

结果

在这里插入图片描述

实现

码前思考

  1. 是我们在刚刚入门这种数据结构时都会讲的表达式求值问题的低级版,话说我现在好像还不会表达式求值😓后面一定要补上!

代码实现

//类似于表达式求值
//只不过这个表达式求值会更加地简单一些
class Solution {
public:
    bool isValid(string s) {
        int size = s.size();
        if(size == 0){
            return true;
        }

        //设置一个栈
        stack<char> st;
        //设置一个指针变量指向string的位置
        int index = 0;
        //设置映射表
        map<char,char> mp;
        mp[')'] = '(';
        mp['}'] = '{';
        mp[']'] = '[';

        //先将第一个字符压栈
        st.push(s[index]);
        index++;

        for(;index<size;index++){
            char cur = s[index];
            //如果是需要匹配的
            if(mp.count(cur) != 0){
                //如果此时栈空了,也算是不匹配,要返回false
                if(st.empty()){
                    return false;
                }else{
                    //取栈顶
                    char top = st.top();
                    //如果不匹配,返回false
                    if(top != mp[cur]){
                        return false;
                    }else{
                        //匹配则弹出
                        st.pop();
                    }
                }
            }else{
                //不需要匹配就进行压栈
                st.push(s[index]);
            }
        }

        //如果读取完之后,栈还不为空,那么说明不匹配
        if(!st.empty()){
            return false;
        }

        return true;
    }
};

码后反思

  1. 注意,在处理栈,队列这类问题时,我们每次取元素的时候都要思考:会不会没有元素了?这是经常忽视的地方!
  2. 这种数据结构类型的题,要考虑清楚所有情况,一个有效的方法就是尝试自己编写多个测试用例,比较坑的那种,只有自己思考清哪里有坑,写代码才能对症下药!测试驱动开发√
  3. 看网友说的,对于栈为空可以一开始在栈中加一个“?”,其实用到的就是编译原理里面的那个知识点了,很好的思想👍

参考文档

  1. 有效的括号(辅助栈法,极简+图解)

二刷代码

学会了使用编译原理里面的‘#’:

//采用栈进行解题
class Solution {
public:
    bool isValid(string s) {
        map<char,char> mp = {{')','('},{']','['},{'}','{'}};
        stack<char> st;
        st.push('#');//编译原理传统艺能

        for(int i=0;i<s.size();i++){//不考虑最后一个字符‘#’
            char curChar = s[i];
            if(s[i]==')'||s[i]=='}'||s[i]==']'){
                if(st.top()==mp[s[i]]){
                    st.pop();
                }else{
                    st.push(s[i]);
                }
            }else{
                st.push(s[i]);
            }
        }

        if(st.top()!='#'){
            return false;
        }else{
            return true;
        }
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值