基础

  1. 特点:后入先出
  2. 如:如十进制转二进制,函数调用栈

    例题:

    1.有效括号

    image.png ```html 示例 1: 输入:s = “()” 输出:true 示例 2:

输入:s = “()[]{}” 输出:true 示例 3:

输入:s = “(]” 输出:false

  1. 思路:
  2. 1. 创建一个栈 stack,遍历字符串
  3. 1. 如果stack最后一项与当前字符串相对应则pop,否则则 push,最后分析 stack 长度
  4. 1. 创建一个 map 实现 括号的对应关系
  5. ```javascript
  6. var isValid = function(s) {
  7. let map = {
  8. '{': '}',
  9. '(': ')',
  10. '[': ']'
  11. }
  12. let stack = []
  13. for (let i = 0; i < s.length; i++) {
  14. if (map[stack[stack.length - 1]] === s[i]) {
  15. stack.pop()
  16. } else {
  17. stack.push(s[i])
  18. }
  19. }
  20. // console.log(stack);
  21. return stack.length === 0
  22. };

2.二叉树的前序遍历

image.png
思路:

  1. 前序遍历:先处理当前节点,再处理左节点,再处理右节点,深度优先遍历
  2. 采用栈空间配合 while 循环的方式,不断地将 left 节点后 push进 stack中,先处理,直到 stack 被清空
    1. function(root) {
    2. const res = []
    3. const stack = []
    4. if (root) {
    5. stack.push(root)
    6. }
    7. // 清空当前栈
    8. while(stack.length) { // while 循环会不断地先 push left 到 stack 直到处理完所有的 left
    9. // 调用栈后入先出
    10. const n = stack.pop()
    11. // 1.先把当前 key 的节点放入 res
    12. res.push(n.val)
    13. if (n.right) {
    14. // 2.把 right 节点先 push 进调用栈,实际上是为了后处理 right
    15. stack.push(n.right)
    16. }
    17. if (n.left) {
    18. // 3.把 left 节点后 push 进调用栈,是为了先处理 left
    19. stack.push(n.left)
    20. }
    21. }
    22. return res
    23. };