【栈】栈的一个基础应用-力扣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();//最后要看下栈里是否为空,否则是不匹配的,因为有剩余
    }
};

离开之前

看到这里,如果伙伴们觉得有帮助的话,不要忘记一键三连哦!

posted @ 2022-05-17 00:06  背包Yu  阅读(5)  评论(0编辑  收藏  举报  来源