FILO
后进先出

模拟栈

  1. // 模拟栈
  2. class Stack {
  3. constructor() {
  4. this.stk = [];
  5. this.top = -1;
  6. }
  7. push(n) {
  8. this.stk[++this.top] = n;
  9. }
  10. pop() {
  11. if (this.top === -1) return;
  12. this.top--;
  13. this.stk.pop()
  14. }
  15. topN() {
  16. return this.top === -1 ? 0 : this.stk[this.top];
  17. }
  18. size() {
  19. return this.top - 1;
  20. }
  21. isEmpty() {
  22. return this.top === -1;
  23. }
  24. }
  25. const stk = new Stack();
  26. stk.push(1);
  27. stk.push(2);
  28. stk.push(3);
  29. console.log(stk);
  30. stk.pop();
  31. console.log(stk);
  32. console.log(stk.size());
  33. console.log(stk.topN());

题目

lc20:括号匹配

  1. 使用一个hash结构,map保存对应括号
  2. 维护一个栈,将左括号入栈
  3. 依次出栈括号,出栈的括号必须得和右括号匹配,否则直接返回false
  4. 最后栈为空才算true

lc144:二叉树的前序遍历

  1. 维护一个栈,按照:根节点-右子节点-左子节点的顺序入栈
  2. 利用一个循环判断树是否遍历完毕
  1. var preorderTraversal = function(root) {
  2. const res = [];
  3. const stack = [];
  4. if (root) stack.push(root);
  5. while(stack.length) {
  6. const n = stack.pop();
  7. res.push(n.val);
  8. n.right && stack.push(n.right)
  9. n.left && stack.push(n.left);
  10. }
  11. return res;
  12. };

lc94:二叉树的中序遍历

  1. 按照根节点-左子节点顺序入栈
  2. 左子节点入栈完成后,依次出栈保存出栈结点并入栈右子结点
  3. 循环第1步
    1. var inorderTraversal = function (root) {
    2. const res = []
    3. const stk = [];
    4. let p = root;
    5. while(stk.length || p) {
    6. while(p) {
    7. stk.push(p);
    8. p = p.left;
    9. }
    10. const last = stk.pop();
    11. res.push(last.val);
    12. p = last.right;
    13. }
    14. return res;
    15. };