题目:给定一个只包括 '(',')','{','}','[',']' 的字符串 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😁
总结:这道题一共大概花了一个半小时,写的时候很难受,但是写出来之后非常开心。
第一次写栈的题目对我还真是一个挑战,本来这道题我不打算写的,因为感觉很难,所以畏惧不敢写,但是我男朋友逼着我写,真非常感谢他的,会鼓励我去跳出舒适区,尝试我不敢尝试的事情。世界上又少一样我怕的东西啦😛