栈数据结构(JS)

88 阅读2分钟
  • 栈是一种遵从后进先出(LIFO)原则的有序集合。新添加或待删除的元素都保存在栈的同一端,称作栈顶,另一端就叫栈底。

一、创建一个基于数组的栈

class Stack {
  constructor() {
    this.items = []  //保存栈里的元素
  }
}

为栈声明以下方法:

  1. push(element(s)):添加一个(或几个)新元素到栈顶。
  2. pop():移除栈顶的元素,同时返回被移除的元素。
  3. peek():返回栈顶的元素,不对栈做任何修改(该方法不会移除栈顶的元素,仅仅返回它)。
  4. isEmpty():如果栈里没有任何元素就返回 true,否则返回 false。
  5. clear():移除栈里的所有元素。
  6. size():返回栈里的元素个数。该方法和数组的 length 属性很类似。

1.向栈添加元素(push)

push(element){
  this.items.push(element)
}

2.从栈移除元素(pop)

pop(){
  return this.items.pop()
}

3.查看栈顶元素(peek)

peek(){
  return this.items[this.items.length - 1]
}

4.检查栈是否为空(isEmpty)

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

5.查看栈的长度(size)

size(){
  return this.items.length
}

6.清空栈元素(clear)

clear(){
  this.items = []
}

二、创建一个基于 JavaScript 对象的 Stack 类

class Stack {
  constructor() {
    this.count = 0
    this.items = {}
  }
}

1.向栈添加元素(push)

push(element){
  this.items[this.count] = element
  this.count++
}

在 JavaScript 中,对象是一系列键值对的集合。要向栈中添加元素,使用 count 变量作为 items 对象的键名,插入的元素则是它的值。 2.从栈移除元素(pop)

pop() {
  if (this.isEmpty()) {
    return undefined
  }
  this.count--
  const result = this.items[this.count]
  delete this.items[this.count]
  return result
}

3.查看栈顶元素(peek)

peek(){
  if (this.isEmpty()) {
    return undefined
  }
  return this.items[this.count - 1]
}

4.检查栈是否为空(isEmpty)

isEmpty(){
  return this.count === 0
}

5.查看栈的长度(size)

size(){
  return this.count
}

6.清空栈元素(clear)

clear(){
  this.items = {}
  this.count = 0
}

7.创建 toString 方法

toString() {
  if (this.isEmpty()) {
    return ''
  }
  let objString = `${this.items[0]}`
  for (let i = 1; i < this.count; i++) {
    objString = `${objString},${this.items[i]}`
  }
  return objString
}

三、用栈实现进制转换

image.png 要把十进制转化成二进制,我们可以将该十进制数除以 2(二进制是满二进一)并对商取整,直到结果是 0 为止。

function decimalToBinary(decNumber) {
  const remStack = new Stack()
  let number = decNumber 
  let rem // 余数
  let binaryString = '' // 定义一个二进制字符串

  while (number > 0) {
    rem = Math.floor(number % 2) // 取余
    remStack.push(rem) // 入栈
    number = Math.floor(number / 2) // 取整
  }

  while (!remStack.isEmpty()) {
    binaryString += remStack.pop().toString(); // 出栈
  }

  return binaryString
}
console.log(decimalToBinary(10));