JS数据结构和算法--栈

概念

栈是一种后进先出的数据结构

  1. 其限制是仅允许在一端进行插入和删除。这一端被称为栈顶,另一端称为栈底;
  2. LFO( last in first out)后进入的元素第一个弹出栈空间;
  3. 向—个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;
  4. 从—个栈删除元素又称作岀栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素;

实现

基于数组实现栈:

    push():添加一个新元素到栈顶 pop():移除栈顶元素,返回被移除元素 peek():返回栈顶的元素 isEmpty():判断是否为空 clear():清空栈 get size:返回元素个数
class Stack {
          
   
  constructor() {
          
   
    this.items = []
  }

  // 添加一个新元素到栈顶
  push(el) {
          
   
    this.items.push(el)
  }

  // 移除栈顶元素,返回被移除元素
  pop() {
          
   
    return this.items.pop()
  }

  // 返回栈顶的元素
  peek() {
          
   
    const length = this.items.length
    return length
      ? this.items[length - 1]
      : undefined
  }

  // 判断是否为空
  isEmpty() {
          
   
    return this.items.length === 0
  }

  // 清空
  clear() {
          
   
    this.items = []
    return true
  }

  // 返回元素个数
  get size() {
          
   
    return this.items.length
  }
  
  // toString
  toString() {
          
   
    let str = 
    for (let i = 0; i < this.items.length; i++) {
          
   
      const el = this.items[i];
      str += el +  
    }
    return str
  }
}

实际应用

实现十进制转二进制? 思路:将十进制数字不断和2相除,保留余数,直到结果取整后为0。将得到的余数从后向前拼接组成二进制数据

// 十进制转二进制
function dec2bin(number) {
          
   
  // 实例化栈
  const stack = new Stack()
  
  // 除2取整结果大于0时循环
  while (number) {
          
   
    // 余数放到栈中
    stack.push(number% 2)
    // 获取整除的结果
    number= Math.floor(number/ 2)
  }

  // 从后向前拼接栈中数据
  let binStr = 
  while (!stack.isEmpty()) {
          
   
    binStr += stack.pop()
  }
  return binStr
}
经验分享 程序员 微信小程序 职场和发展