【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 ...
随机推荐
- [转帖]腾讯北极星 Polaris 试用
https://www.cnblogs.com/QIAOXINGXING001/p/15482012.html 了解.试用 昨天稀土开发者大会2021提到了腾讯开源的北极星, 试用一下; 官网: 北极 ...
- 拼多多的U盘都是垃圾
春节期间陪孩子玩拼多多的果园, 然后发现推送的U盘很便宜就买了下 结果发现.. U盘都是扩容盘,非常垃圾 如下图: 警告: 只有 255933 MB可测试,总容量 255935 MB. 媒体很可能已损 ...
- awk的简单样例
shell awk求和 当第一列相同时,对应的第二列相加 awk'{sum[$1]+=$2}END{for(c in sum){print c,sum[c]}}'输入文件名 在Shell中,我们可以用 ...
- 多模态 GPT-V 出世!36 种场景分析 ChatGPT Vision 能力,LMM 将全面替代大语言模型?
LMM将会全面替代大语言模型?人工智能新里程碑GPT-V美国预先公测,医疗领域/OCR实践+166页GPT-V试用报告首发解读 ChatGPT Vision,亦被广泛称为GPT-V或GPT-4V,代表 ...
- TypeScript类的修饰符 public private protected的详细讲解
简单介绍一下public private protected public:当一个类的成员变量没有修饰的时候,默认的就是 public 进行修饰.外部是可以进行访问的. private属性只能够在父类 ...
- css动画京东小布hover放大
<style> .box { width: 183px; height: 130px; overflow: hidden; border: 1px solid pink; } div im ...
- 开发QQ官方机器人
QQ 频道机器人开发简明教程 1. 简介 QQ 频道机器人是一种可以在 QQ 频道中与用户进行互动的服务.这个教程旨在帮助新手学习如何使用 Python 的官方SDK,快速实现一些基本的机器人功能. ...
- GPTs prompts灵感库:创意无限,专业级创作指南,打造吸睛之作的秘诀
GPTs prompts灵感库:创意无限,专业级创作指南,打造吸睛之作的秘诀 优质prompt展示 1.1 极简翻译 中英文转换 你是一个极简翻译工具,请在对话中遵循以下规则: - Prohibit ...
- LyScript 实现绕过反调试保护
LyScript插件中内置的方法可实现各类反调试以及屏蔽特定API函数的功能,这类功能在应对病毒等恶意程序时非常有效,例如当程序调用特定API函数时我们可以将其拦截,从而实现保护系统在调试时不被破坏的 ...
- vue-router.esm.js:2065 Uncaught (in promise) Error: Redirected when going from "/login?redirect=%2Fhome" to "/home" via a navigation guard.
原因: vue-router路由版本更新产生的问题,导致路由跳转失败抛出该错误; 真正的原因是由于返回了一个Promise对象, 正常的跳转由then方法执行 当正常的路由跳转, 被"路 ...