数据结构之栈的算法题(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();
    }
};
相关推荐
人工智能培训27 分钟前
人工智能性别与地域偏见的成因及消解路径
大数据·人工智能·算法·生活
鹿角片ljp28 分钟前
LeetCode 56:合并区间复盘|从排序思维到 List<int[]> 的简洁写法
算法·leetcode·list
刘某的Cloud29 分钟前
k8s部署prometheus架构规则
linux·运维·kubernetes·prometheus·监控
mounter62540 分钟前
从 2026 LSFMM/BPF 峰会看 eBPF 生态演进:技术变革、工具全景与资源泄漏诊断实战
linux·linux kernel·kernel
M78佐菲44 分钟前
Linux学习笔记:网络通信
linux·笔记·学习·算法
漂流瓶jz1 小时前
UVA-1609 不公平竞赛 题解答案代码 算法竞赛入门经典第二版
数据结构·算法·链表·贪心·aoapc·算法竞赛入门经典·uva
AAA代码批发商1 小时前
Days37 Linux C 网络编程:UDP、TCP 与 HTTP 协议实战详解
linux·c语言·网络
好评1241 小时前
【Linux】传输层协议UDP
linux·运维·udp