# 堆和栈
# 栈 典型的后进先出
const stack = [];
stack.push(1);
stack.push(2);
const item1 = stack.pop();
const items = stack.pop();
# 栈的应用场景
- 十进制转二进制
- 判断字符串的括号是否有效 ()()() ((((((())))))) 入栈 出栈 栈空的是合法的
- 函数调用堆栈 最后调用的函数 最早被执行完 调用堆栈
# leetCode
20: 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。 有效字符串需满足:
左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 注意空字符串可被认为是有效字符串。
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
// 新建一个新的栈
// 扫描字符串,遇到左括号入栈,遇到和栈顶括号类型匹配的右括号就出栈,类型不匹配直接判定为不合法
// 最后栈空则合法,否则不合法
if (s.length % 2 !== 0) {
return false;
}
let stack = [];
const len = s.length;
for (let i = 0; i < len; i++) {
// 时间复杂度 O(n) 空间复杂度 O(n)
const c = s[i];
if (c === "{" || c === "[" || c === "(") {
stack.push(c);
} else {
const t = stack[stack.length - 1]; // 后进
if (
(c === ")" && t === "(") ||
(c === "}" && t === "{") ||
(c === "]" && t === "[")
) {
stack.pop(); // 先出
} else {
return false;
}
}
}
return stack.length === 0;
};