数据结构之栈的算法题(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();
    }
};
相关推荐
倒头就睡的小比特1 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!1 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
未济1 天前
linux 配置环境变量
linux
傲世仙尊1 天前
目录即文件-Ext文件系统收尾篇
linux·c语言
猎头南楼1 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
m0_547486661 天前
《数据结构教程》全套 PPT课件2026
数据结构
_艾伦 耶格尔.1 天前
进程间通信
linux
旖旎夜光1 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark1 天前
大规模并行计算中的负载均衡算法研究4
算法
Liuqy-051 天前
Linux IO编程——静态库、动态库
linux