栈是什么
- 一个后进先出的数据结构
- JS 中没有栈,但是可以用 Array 实现栈的功能
代码示例
const stack = [];
// 入栈
stack.push(1);
stack.push(2);
// 出栈
const item1 = stack.pop(); // pop 方法是移出数组最后一个元素,即栈顶的元素
栈的应用场景
需要后进先出的场景,例如:十进制转二进制、判断字符串的括号是否有效、函数调用堆栈…
十进制转二进制
通过除二取余方法可以总结出这个方法的重点是:
- 后出来的余数反而要排到前面
- 把余数依次入栈,再出栈,就可以实现余数倒序输出
有效的括号问题
判断括号是否正确闭合,比如:
((((())))) -- 正确
()()()() -- 正确
((((((() -- 错误
((()(()))) -- 正确
- 越靠后的左括号,对应的右括号就越靠前
- 左括号入栈,右括号出栈,最后栈空即合法
函数调用堆栈
function greeting() {
// ...
sayHi();
// ...
}
function sayHi() {
return 'Hi';
}
greeting();
// ...
- 最后调用的函数,最先执行完
- JS 解释器使用栈来控制函数的调用顺序
LeetCode题目
20.有效的括号
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
解题步骤:
- 新建一个栈
- 扫描字符串,遇左符号入栈,遇到和栈顶符号类型匹配的右符号就出栈,类型不匹配直接判定为不合法
- 最后栈空了就合法,否则不合法
答案:
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
if (s.length === 1) return false
let stack = [];
const map = {
'(': ')',
'{': '}',
'[': ']'
}
for (let i = 0; i < s.length; i ++) {
if (Object.keys(map).includes(s[i])) {
// 左符号
stack.push(s[i])
} else {
// 右符号
if (map[stack[stack.length - 1]] === s[i]) {
stack.pop()
} else {
return false
}
}
}
return !stack.length
};