有效的括号

98 阅读2分钟

题目:给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每个右括号都有一个对应的相同类型的左括号。

思路:复习408的时候就看到了这个题目,但是是手动模拟的,所以一看到这个题目就知道是用栈,但是在c+++中我并不会使用栈,所以临时学习了一下栈的使用方法。

栈的声明:stack<type> 栈名 type是栈的类型,本题用的是char类型,栈名为st。

入栈:st.push()。

出栈:st.pop() 输出栈顶元素,但是不返回栈顶元素。

栈顶元素:st.top() 返回栈顶元素,但是不输出栈顶元素。

栈空:st.empty() 当栈空返回true。

还补充一下c++的string可以像数组一样由下标索引得到具体的字符,求长度是s.length()。

代码思路就是应用栈一一判断以下条件:

当字符串是单数的时候,则都是无法匹配的,返回结果均为false。

当栈空,则无法出栈。

当栈不空,说明没有完全匹配,所以括号匹配失效,返回false。

由以上思路,得到以下代码。

bool isValid(string s) {
        stack<char> st;
        if(s.length()%2 == 1) return false;
        for(int i=0;i<s.length();i++){
            if(s[i] == '(' || s[i] == '[' || s[i] == '{')
                st.push(s[i]);
            else{
                if(!st.empty() && ((st.top() == '(' && s[i] == ')') || (st.top() == '[' && s[i] == ']') || (st.top() == '{' && s[i] == '}'))){
                    st.pop();
                    continue;
                }else return false;
            }
        }
        if(!st.empty()) return false;
        return true;
    }

可以看到我的提交记录,执行的时间真的非常好,第一次有0ms😁

image-20230416181734791.png

总结:这道题一共大概花了一个半小时,写的时候很难受,但是写出来之后非常开心。

第一次写栈的题目对我还真是一个挑战,本来这道题我不打算写的,因为感觉很难,所以畏惧不敢写,但是我男朋友逼着我写,真非常感谢他的,会鼓励我去跳出舒适区,尝试我不敢尝试的事情。世界上又少一样我怕的东西啦😛