小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
栈
- 栈的数据结构为后进先出(LIFO),可使用数组或链表的方式实现
- 实际应用场景:
- 系统调用栈,多个方法嵌套调用,最后调用的方法,最先执行完毕
- 使用栈实现浏览器前进后退,先后进入A/B/C三个页面,最后进入的C页面,点击后退时,C页面反而最先返回
LeetCode第20题:有效括号
题目描述
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:输入:s = "([)]"
输出:false
示例 5:输入:s = "{[]}"
输出:true
提示:
1 <= s.length <= 104s仅由括号'()[]{}'组成
思路
- 遍历字符串,新建存储空间
- 情况1:按先后顺序记录所有出现过的左边括号,已记录左括号如果能够满足后记录先匹配的原则,与剩余字符串按顺序按顺序一一配对,那么结果返回
true,否则返回false - 情况2:如果在记录左括号的同时,还夹杂了右括号,那么可立刻判断此右括号与最后一个记录的左括号是否成对,是则继续执行,否则返回
false
- 情况1:按先后顺序记录所有出现过的左边括号,已记录左括号如果能够满足后记录先匹配的原则,与剩余字符串按顺序按顺序一一配对,那么结果返回
- 配对成功的括号,执行出栈操作,如果全部匹配出栈,结果返回
true,否则返回false - 括号是成双成对出现的,所以字符串长度如果是奇数,返回
false
代码实现
/**
* @param {string} s
* @return {boolean}
*/
const isValid = function(s) {
if (!s.length || s.length % 2 === 1) return false
// 这里使用数组的方式实现栈
// 查看栈顶: stack[stack.length - 1]
// 压栈: stack.push()
// 出栈: stack.pop()
let stack = []
for(let i = 0;i < s.length; i++) {
if (s[i] === '{' || s[i] === '[' || s[i]=== '(') {
stack.push(s[i])
} else {
// 第一次遍历或遍历后一个左括号都不存在或先出现右括号,返回false
if (stack.length === 0) return false
// 中间值
let match = ''
if (s[i] === '}') {
match = '{'
} else if (s[i] === ']') {
match = '['
} else if (s[i] === ')') {
match = '('
}
if (match !== stack[stack.length - 1]) {
return false
} else {
stack.pop()
}
}
}
// 遍历后如果stack全部匹配完成,那么返回true,否则返回false
return !stack.length
};