JS算法系统学习第三章:栈结构

121 阅读2分钟

上一章:# JS算法系统学习第二章:数组结构

认识栈结构

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为钱顶,相对地,把另一端称为栈底,向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

特点:后进先出即 Last in first out(LIFO)

image.png

函数调用栈

an函数执行完出栈...a2函数执行完出栈,a1函数执行完出栈 —— 函数任务执行完成。

封装栈结构

// push 进栈(添加一个元素到栈顶)
// pop 出栈
// peek 返回栈顶

// isEmpty() 判断是否是空栈
// clear() 清空栈结构
// size()  栈里有几个元素
// toString()  转为普通字符串(可有可无)

class Stack{
  // constructor(){
  //   this.items = [];
  // }
  // items = []; // items 可以放在 constructor中,也可以直接提到外面来
  // _items = []; // 给items加下划线_,表示是私有的。君子协定,大家公认的,但其实外部依旧可以访问修改的。
  #items = []; // es13 出现 js 默认支持的私有属性,加井号 # 表示私有属性。

  pop(){
    this.#items.pop();
  }
  
  push(data){
    this.#items.push(data);
  }
  
  peek(){
    // return this.items[this.items.length - 1]
    return this.#items.at(-1);
  }

  isEmpty(){
    return this.#items.length === 0;
  }

  size(){
    return this.#items.length;
  }

  clear(){
    this.#items = []
  }

  toString(){
    return this.#items.join(" ")
  }
}

let stack = new Stack()

测试:

栈结构的应用

  1. 进制的转换
class Stack{
  #items = [];

  pop(){
    return this.#items.pop();
  }
  
  push(data){
    this.#items.push(data);
  }
  
  peek(){
    // return this.items[this.items.length - 1]
    return this.#items.at(-1);
  }

  isEmpty(){
    return this.#items.length === 0;
  }

  size(){
    return this.#items.length;
  }

  clear(){
    this.#items = []
  }

  toString(){
    return this.#items.join(" ")
  }
}

function convert(decNumber, base){
  let remStack = new Stack()
  let number = decNumber
  let string = ""
  let baseString = "0123456789ABCDEF"

  while(number > 0) {
    remStack.push(number%base)
    number = Math.floor(number/base)
  }

  while(!(remStack.isEmpty())){
    string += baseString[remStack.pop()]
  }
  
  return string
}

convert(50, 2) // 110010
convert(50, 8) // 62
convert(500, 16) // 1F4

下一章:# JS算法系统学习第四章:队列结构