【LeetCode栈与队列#02】有效括号
有效括号
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 注意空字符串可被认为是有效字符串。
示例 1:
- 输入: "()"
- 输出: true
示例 2:
- 输入: "()[]{}"
- 输出: true
示例 3:
- 输入: "(]"
- 输出: false
示例 4:
- 输入: "([)]"
- 输出: false
示例 5:
- 输入: "{[]}"
- 输出: true
思路
一看就是用栈做的
只要遍历将字符串压栈,然后再出栈,如果和之前的字符串相比一致,那么说明可以配对
但是,题目的考察点在于:如何找出(模拟出)不匹配的情况
不匹配的情况
不管怎么组合,所有不匹配的情况都可以归类为以下三种:
第一种情况,字符串里左方向的括号多余了 ,所以不匹配。

第二种情况,括号没有多余,但是括号的类型没有匹配上。

第三种情况,字符串里右方向的括号多余了,所以不匹配。

举一些例子:
)(属于情况3,即右括号多余,因为左边没有左括号与其对应
[(])属于情况2,即括号类型不匹配,虽然括号数量没有多也没有少
...等等还有很多,反正仔细去看都绕不开这三种情况
用栈模拟不匹配情况
显然我们是要遍历括号串,将其压入栈中的
注意,每次我们压栈的括号类型要与当前遍历到的相反,这样在出栈比对的时候就比较方便
如果不是很理解我就这么说吧
满足有效括号的括号串都是偶数个数,且两两对应
如果按上面的操作就会有以下效果
例如,一有效括号如:([])
======先看栈顶,没有与当前左括号匹配的,把相反方向括号压栈
↓
([])
栈
)
======先看栈顶,没有与当前左中括号匹配的,把相反方向括号压栈
↓
([])
栈
])
======先看栈顶,栈顶与当前右中括号匹配的,pop栈顶
↓
([])
栈
])
======先看栈顶,栈顶与当前右括号匹配的,pop栈顶
↓
([])
栈
)
//遍历结束,栈空,完全匹配,有效括号
以上就是栈在该问题中的使用方式
即在遍历结束时或过程中,通过栈的状态来判断括号串是否有效
实际上对应三种不匹配情况,栈的状态也会有三种
以上面的括号为例
动画如下:

第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false
第二种情况:遍历字符串匹配的过程中,发现栈里没有要匹配的字符。所以return false
第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号return false
从这里可以看出,往栈压入相反方向括号的好处:能够与现有的括号进行比较
因为我们在压栈之前都要先判断当前遍历值与栈顶元素是否匹配,只有有效括号串能够在遍历结束时完全匹配(因为有效括号串是对称的)
代码
步骤:
(0、剪枝,如果括号串是奇数个数,直接false)
1、创建栈,遍历括号串遇到什么括号就把相反方向的括号push进栈
2、判定栈是否为空或者栈顶与当前遍历值不匹配,满足则返回false
3、遍历结束,判断当前栈内是否为空,为空则是有效括号,还有东西则表明没有完全匹配上,false
class Solution {
public:
bool isValid(string s) {
//剪枝
if(s.size() % 2 != 0){
return false;
}
//创建栈
stack<char> st;
//遍历括号串
for(int i = 0; i < s.size(); ++i){
if(s[i] == '('){
st.push(')');
}else if(s[i] == '['){
st.push(']');
}else if(s[i] == '{'){
st.push('}');
}else if(st.empty() || s[i] != st.top()){//遍历过程中栈空或者栈顶与当前遍历值不匹配
return false;
}else{//栈顶与当前遍历值相等,弹出栈顶值
st.pop();
}
}
return st.empty();//遍历完成,判断当前栈中是否还有元素剩余,没有就是有效括号
}
};
【LeetCode栈与队列#02】有效括号的更多相关文章
- SDUT-2134_数据结构实验之栈与队列四:括号匹配
数据结构实验之栈与队列四:括号匹配 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 给你一串字符,不超过50个字符,可能 ...
- leetcode 栈和队列类型题
1,Valid Parentheses bool isVaild1(string& s) { // 直接列举,不易扩展 stack<char> stk; ; i < s.le ...
- 数据结构实验之栈与队列四:括号匹配(SDUT 2134)
#include <bits/stdc++.h> using namespace std; typedef long long ll; char s[100]; char a[100]; ...
- Leetcode栈&队列
Leetcode栈&队列 232.用栈实现队列 题干: 思路: 栈是FILO,队列是FIFO,所以如果要用栈实现队列,目的就是要栈实现一个FIFO的特性. 具体实现方法可以理解为,准备两个栈, ...
- YTU 3003: 括号匹配(栈和队列)
3003: 括号匹配(栈和队列) 时间限制: 1 Sec 内存限制: 128 MB 提交: 2 解决: 2 [提交][状态][讨论版] 题目描述 假设一个表达式中只允许包含三种括号:圆括号&quo ...
- leetcode 栈 括号匹配
https://oj.leetcode.com/problems/valid-parentheses/ 遇到左括号入栈,遇到右括号出栈找匹配,为空或不匹配为空, public class Soluti ...
- 栈和队列数据结构的相互实现[LeetCode]
栈是先进后出,队列是先进后出,这里讨论一下两种数据结构之间的相互实现. 一.用两个栈实现队列 我们用一个栈来实现队列的进队操作(栈A),用另一个栈来实现队列的出队操作(栈B). 1.入队列: 把元素放 ...
- 【LeetCode题解】232_用栈实现队列(Implement-Queue-using-Stacks)
目录 描述 解法一:在一个栈中维持所有元素的出队顺序 思路 入队(push) 出队(pop) 查看队首(peek) 是否为空(empty) Java 实现 Python 实现 解法二:一个栈入,一个栈 ...
- C数据结构-栈和队列,括号匹配举例---ShinePans
1.栈和队列是两种特殊的线性表 运算操作被限定仅仅能在表的一端或两端插入,删除元素,故也称它们为限定的线性表结构 2.栈的基本运算 1).Stackinit(&s) 构 ...
- LeetCode初级算法--其他02:有效的括号
LeetCode初级算法--其他02:有效的括号 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net ...
随机推荐
- 某环境私有云 rpm 包安装失败总结
1. 最近公司同事说一个项目搭建环境时 rpm 安装mysql数据库会报错 错误图片主要如下: 第一个错误提示是 提示 /etc/host.conf line 2: bad command `nosp ...
- TypeScript接口的讲解-强制约束-可选属性-任意多个属性-只读属性
接口 接口:可以描述类的一部分抽象行为, 也可以描述数据的结构形状 接口一般首字母大写, 接口中 可以定义为 强制约束 可选属性 只读属性 任意属性 # 强制约束 // 定义接口 interface ...
- 你不知道的Promise状态变化机制
1.Promise中PromiseStatus的三种状态 var p = new Promise((resolve, reject) => { // resolve 既是函数也是参数,它用于处理 ...
- # 继续前行github star突破8k即时通讯IM开源项目OpenIM版本发布计划
项目简介 OpenIM继续领跑开源IM领域,在广大开发者的支持下,目前github star突破8k.在数据泄露.信息外泄.隐私滥用的时代,IM私有化部署需求旺盛.其中,政企协同办公对IM需求猛增,随 ...
- Leetcode 2题 两数相加
题目链接 https://leetcode-cn.com/problems/add-two-numbers/ 题目描述 给你两个非空的链表,表示两个非负的整数.它们每位数字都是按照逆序的方式存储的,并 ...
- Leetcode 92题反转链表 II(Reverse Linked List II) Java语言求解
前言 反转链表可以先看我这篇文章: Leetcode 206题 反转链表(Reverse Linked List)Java语言求解 题目链接 https://leetcode-cn.com/probl ...
- svn忽略某个目录后update出现fetching
忽略某个子目录 在svn udpate一个大目录时忽略特定的子目录,主要是子目录下内容已经单独拉取过,并且这个大目录对于程序来说,可以是只读的. 操作方法:选中要忽略的目录,右键 svn - Unve ...
- 手撕Vue-构建Vue实例
前言 要想使用Vue必须先创建Vue的实例, 创建Vue的实例通过new来创建, 所以说明Vue是一个类, 所以我们要想使用自己的Vue, 就必须定义一个名称叫做Vue的类. 只要创建好了Vue的实例 ...
- TienChin 渠道管理-配置校验失败信息
新建 ValidationMessages.properties: channel.name.notnull=渠道名称不能为空 channel.type.notnull=渠道类型不能为空 channe ...
- 3.6 Windows驱动开发:内核进程汇编与反汇编
在笔者上一篇文章<内核MDL读写进程内存>简单介绍了如何通过MDL映射的方式实现进程读写操作,本章将通过如上案例实现远程进程反汇编功能,此类功能也是ARK工具中最常见的功能之一,通常此类功 ...