什么是栈
一个后进先出的数据结构,用栈的方法,可以模拟递归,改写递归

如何实现栈
const stack = []// 入栈stack.push(1)stack.push(2)//出栈stack.pop();stack.pop();
场景
后进先出的场景。比如: 十进制转二进制,判断字符串括号是否有效,函数调用堆栈
十进制转二进制
算法: 当前值处以2,余1/0, 一直到0位置。以余数入栈,再依次出栈,拿到最终结果

- 如上图所示,35的二进制值是100011
var trans = function(data) {const stack = []while (data > 0) {// 拿到余数,存入栈stack.push(data % 2);// 向下取整data = Math.floor(data / 2)}return stack.reverse().join().replace(/,/g, "")};
有效的括号
给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
- 算法: 判断括号是否有效闭合,越靠后的左扩号,对应的右括号越靠前。左括号入栈,右括号出栈,最后栈空了就是合法的
- 解法
var isValid = function(s) {const stack = [];for(let i = 0 ; i < s.length; i++) {const c = s[i]if(c === '(' || c === '[' || c === '{') {stack.push(c)} else {const t = stack[stack.length - 1];if((t === '{' && c === '}')||(t === '[' && c === ']')||(t === '(' && c === ')')) {stack.pop()} else {return false}}}return stack.length === 0};
- 时空复杂度
- 时间复杂度,O(n)
- 空间复杂度,O(n)
函数调用堆栈
- 最后调用的函数,最先执行完
- Js解释器使用栈来控制函数的调用顺序
二叉树前序遍历
给你二叉树的根节点 root ,返回它节点值的 前序 遍历。
var preorderTraversal = function(root) {const res = []const stack = []if(root) {stack.push(root)}while(stack.length) {const n = stack.pop()res.push(n.val)if(n.right) stack.push(n.right)if(n.left) stack.push(n.left)}return res};
- 时空复杂度
- 时间复杂度,O(n)
- 空间复杂度,O(n)
