【栈】栈的一个基础应用-力扣20.有效的括号【超详细的算法解释】
说在前面
这题其实是数据结构-栈的一个最最基本的应用,也是一道超级经典的面试题,我觉得大家是肯定不能错过的,所以在这里博主推荐给大家。如果对数据结构-栈还没有很好了解的同志们,可以看看博主的数据结构专栏和有关栈和队列的总结博客哦!传送门在这里给到大家了。
当然,此篇博主用了C++的STL库里的栈,如果用C写就要把C实现栈全复制过来。
题目:20. 有效的括号
博主给大家的话
那么这里博主先安利一下一些干货满满的专栏啦!
数据结构专栏:数据结构 这里包含了博主很多的数据结构学习上的总结,每一篇都是超级用心编写的,有兴趣的伙伴们都支持一下吧!
算法专栏:算法 这里可以说是博主的刷题历程,里面总结了一些经典的力扣上的题目,和算法实现的总结,对考试和竞赛都是很有帮助的!
力扣刷题专栏:Leetcode 想要冲击ACM、蓝桥杯或者大学生程序设计竞赛的伙伴,这里面都是博主的刷题记录,希望对你们有帮助!
C的深度解剖专栏:C语言的深度解剖 想要深度学习C语言里面所蕴含的各种智慧,各种功能的底层实现的初学者们,相信这个专栏对你们会有帮助的!
题目描述
解题思路
巧妙利用栈
先进后出
的一个性质,如果遇到s
里的左括号,压栈进去,如果遇到s
的右括号,出栈,并和s
当前元素比对,如果括号匹配,则符合条件。
当然,在这其中有很多细节的地方,如果不注意,OJ是过不了的!要注意的细节博主在代码里以注释的形式提醒大家!
完整实现代码
//20. 有效的括号
class Solution {
public:
bool isValid(string s) {
if (s.size() % 2 == 1) {//如果字符串是奇数长度,肯定不符合题意。
return false;
}
stack<char>st;
int i = 0;
while (i <= s.size() - 1) {
if (s[i] == '(' || s[i] == '[' || s[i] == '{') {
//如果是左括号,入栈
st.push(s[i]);
++i;//这个迭代的i不要忘记
}
else {//如果是右括号,出栈
if (st.empty()) {//空的没法出,而且肯定不匹配
return false;
}
if ((st.top() == '{' && s[i] == '}')
|| (st.top() == '(' && s[i] == ')')
|| (st.top() == '[' && s[i] == ']')) {
++i;
if (!st.empty()) {//空了就不能pop了
st.pop();
}
else return false;
}
else {
return false;
}
}
}
return st.empty();//最后要看下栈里是否为空,否则是不匹配的,因为有剩余
}
};
离开之前
看到这里,如果伙伴们觉得有帮助的话,不要忘记一键三连哦!