数据结构之栈的算法题(OJ)

20. 有效的括号 - 力扣(LeetCode)20. 有效的括号 - 给定一个只包括 '(',')','{','}','','' 的字符串 s ,判断字符串是否有效。有效字符串需满足: 1. 左括号必须用相同类型的右括号闭合。 2. 左括号必须以正确的顺序闭合。 3. 每个右括号都有一个对应的相同类型的左括号。 示例 1:输入:s = "()"输出:true示例 2:输入:s = "()\[\]{}"输出:true示例 3:输入:s = "(]"输出:false示例 4:输入:s = "(\[\])"输出:true示例 5:输入:s = "()"输出:false 提示: * 1 <= s.length <= 104 * s 仅由括号 '()\[\]{}' 组成https://leetcode.cn/problems/valid-parentheses/

题目

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

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

思路分析

括号匹配是栈的经典应用场景。 栈的特点:后进先出。最后出现的左括号,要最先被对应的右括号抵消。

算法流程:

  1. 遍历字符串每一个字符
  2. 遇到左括号 ( { [:直接压入栈中保存
  3. 遇到右括号 ) } ]
    • 如果栈为空:没有左括号与之匹配,直接返回 false
    • 判断栈顶的左括号和当前右括号是否配对,不匹配直接返回 false
    • 匹配成功,弹出栈顶元素
  4. 循环结束,栈必须为空。如果栈里面还有残留左括号,说明括号没有闭合,返回 false。
cpp 复制代码
class Solution {
public:
    bool isValid(string s) {
        stack<char> st;
        for(auto e:s)
        {
            if(e=='['||e=='{'||e=='(')
            st.push(e);
            else
            {
                if(st.empty())
                return false;
                
                if((st.top()!='('&&e==')')||
                (st.top()!='['&&e==']')||
                (st.top()!='{'&&e=='}'))
                return false;
                st.pop();
            }
        }
        
        
        return st.empty();
    }
};
相关推荐
源图客几秒前
解决CentOS操作系统网络异常问题
linux·运维·centos
YSL07012421 分钟前
一文通关-----排序
数据结构·算法
HideF10 小时前
Linux sudo
linux
FlightYe10 小时前
视界原理之3D视频(四):裸眼、眼镜和头显
android·linux·c++·3d·ffmpeg·音视频
ZhengEnCi11 小时前
GPT-6 Astra 爆改 Qwen 权重真有那么神吗:权重空间编程 0.016% 参数的真相
算法·架构
罗西的思考11 小时前
【轻量化复刻大模型 / KIMI K3】KDA(Kimi Delta Attention):并行
人工智能·算法·机器学习
蹊黎11 小时前
Linux 下用 C 语言实现进度条
linux·c语言·单片机
牛马鸡niumasi12 小时前
【Linux】C语言文件操作
linux
say_fall12 小时前
【Linux系统编程】Ext 文件系统:磁盘与存储、文件与目录、现代计算机究竟如何寻找文件
linux·运维·服务器·数据库·c++
夜不会漫长13 小时前
C++:红黑树
数据结构·算法