1.有效的括号
题目:
-
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
-
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
-
题目来源于
力扣: leetcode.cn/problems/va…
示例1:
输入: s = "()"
输出: true
示例2:
输入: s = "()[]{}"
输出: true
示例3:
输入: s = "(]"
输出: false
题解:
- 解题思路
- 对于没有闭合的左括号来说,越靠后的左括号,对应的右括号越靠前
- 新建一个栈
- 扫描字符串,遇到左括号入栈(push)
- 遇到和栈顶括号类型匹配的右括号就出栈------栈顶括号: 栈(数组)中的最后一位
- 类型不匹配直接定为不合法
- 最后栈空了就合法,否则就是不合法的
- 更加严谨一点可以判断是否为奇数,奇数则阻断执行
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
// 判断字符串的长度是否等于奇数,等于则停止执行
if(s.length % 2 === 1) return false
// 1.新建一个栈
const stack = [];
// 2.通过for循环来扫描字符串的长度
for(let i = 0; i < s.length; i += 1){
// 3.声明变量char
const char = s[i]; // i 作为index
// 4. 如果遇到左括号就推入栈中
if(char === '(' || char === '{' || char === '['){
stack.push(char);
} else {
// 5. 如果遇到右括号就要判断是否和栈顶元素匹配
// 就是获取数组最后一项
const top = stack[stack.length - 1]
if(
// 判断它和栈顶元素类型是否匹配
(top === '(' && char === ')') ||
(top === '{' && char === '}') ||
(top === '[' && char === ']')
){
// 6. 类型相同则在栈中消除掉
stack.pop();
} else {
return false
}
}
}
// 判断栈是否为空
return stack.length === 0;
};
// 时间复杂度为O(n) s.length 的长度
// 空间复杂度也是O(n) stack可能会占用n个内存单元s.length
JS 中的函数调用堆栈
- 典型的后进先出的例子
- js解释器就是利用了栈数据结构控制函数的调用顺序,满足后进先出的特性
- 下面这个例子就是 最后调用的 最先执行完 fn3
function fn1 () {
fn2();
}
function fn2 () {
fn3()
}
function fn3 () {}
fn1()