01-栈的实现

144 阅读2分钟

「这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战」。

主要特点

  • LIFO 后进先出
  • 线性结构

场景

  • 书架
  • 函数调用栈

栈的封装

class Stack {
  // 初始化一个数组,用数组实现栈结构
    constructor() {
      this.items = []
    }
    // 获取当前栈元素个数
    size() {
      return this.items.length
    }
    // 增加元素
    push(element) {
      this.items.push(element)
    }
​
    // 删除元素
    pop() {
      this.items.pop()
    }
    // 查看栈顶元素
    peek() {
      let topElement = this.items[this.size()-1]
      return topElement;
    }
    // 判空
    isEmpty() {
      return this.size === 0 
    }
    // toString
    toString() {
      let res = ''
      for (var i = this.size() - 1; i >= 0; i--) {
        res +=  this.items[i] + ''
      }
      return res
    }
  }

主要方法:

  1. size()--获取当前栈里元素个数
  2. isEmpty()--判断栈是否为空
  3. toString()--输出栈里的所有元素
  4. push()--栈顶增加元素(入栈)
  5. pop()--栈顶删除元素(出栈)
  6. peek()--访问栈顶元素

测试

let stack = new Stack();
console.dir(Stack)
stack.push(1)
stack.push(5)
stack.push(8)
stack.pop()
stack.push(10)
console.log(stack.peek())
console.log(stack.isEmpty())
stack.toString()
console.log(stack.size())

结果

class Stack
10
false
3

题目一:十进制转二进制

给一个十进制数字,转换成二进制数字

function dec2Bin(num) {
            let stack = new Stack()
            while(num > 0) {
                stack.push(num%2)
                num = Math.floor(num/2)
            }
            console.log(num)
            return stack.toString()
        }

整体思路

短除法,将该数除以2取余数,再将整数部分再对2取余,不断循环,直到该数为0,最后将余数从后往前输出

 9%2 => 1   9//2 => 4
 4%2 => 0       4//2 => 2
 2%2 => 0       2//2 => 1
 1%2 => 1       1//2 => 0
 =>1001

解题步骤 ​

  1. 声明一个栈 let stack = new Stack()
  2. 该数对二取余,将余数放入栈中 stack.push(num%2)
  3. 该数对二向下取整,将整数重新赋值给该数,作为下一次循环 num = Math.floor(num/2)
  4. 直到该数小于等于0才结束循环 while(num > 0)
  5. 最后返回栈中的结果,由于栈是从栈顶往下输出的,所以最终出栈顺序即为我们想要的结果 return stack.toString()

题目二:有效的括号

leetcode20. 有效的括号

解题思路

核心思想

1.借助map映射数据类型存储对应括号 2.左括号则入栈,右括号检测是否与栈顶括号匹配,匹配则出栈,不匹配直接返回false

解题步骤

1.长度为奇数,肯定不匹配,直接返回false 2.map存储对应括号 3.声明一个数组作为栈 4.遍历字符串 5.若为左括号,则入栈 6.否则即为右括号,则直接取栈顶元素看是否与之匹配,匹配则出栈,不匹配直接返回false 7.循环结束,栈空则全部匹配,不空则说明有左括号剩余,返回false

代码

/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function(s) {
            if(s.length%2===1) return false
            let map = new Map([
                [')','('],
                [']','['],
                ['}','{'],
            ])
            let stack = []
            for(let c of s) {
                if(Array.from(map.values()).includes(c)) {
                    stack.push(c)
                }else {
                    let top = stack[stack.length-1]
                    if(top !== map.get(c)) {
                        return false
                    }
                    stack.pop()
                }
​
            }
    return stack.length === 0;
        };