JavaScript【数据结构与算法】(一) 栈与队列

博客地址:栈与队列

栈结构,栈结构就是在数组的基础上限制一些操作
在这里插入图片描述

栈的常用方法

  • push(): 添加一个新元素到栈顶

  • pop(): 移除栈顶元素,同时返回被移除的元素

  • peek(): 返回栈顶元素,不对栈做修改

  • isEmpty(): 栈里无元素则返回true

  • size(): 返回栈的元素个数

  • toString(): 将栈结构的内容以字符形式返回

栈的代码实现


function Stack() {
  //栈的属性
  this.items  = []

  //栈的操作

  Stack.prototype.push = function(element) {
    this.items.push(element)
  }

  Stack.prototype.pop = function() {
    return this.items.pop()
  }

  Stack.prototype.peek = function() {
    return this.items[this.items.length - 1]
  }

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

  Stack.prototype.size = function() {
    return this.items.length
  }

  Stack.prototype.toString = function() {
    let resultString = ""
    for (const item of this.items) {
      resultString += item + ' '
    }
    return resultString
  }
}

通过栈结构实现二进制转化为十进制

每次将余数压入栈中,最后出栈的顺序便是转化的结果

function dec2Bin(decNumber) {

  let stack = new Stack()
  while (decNumber > 0) {
    stack.push(decNumber % 2)

    decNumber = Math.floor(decNumber / 2)
  }

  let binaryString = ""
  while(!stack.isEmpty()) {
    binaryString += stack.pop()
  }
  return binaryString
}

队列

在这里插入图片描述
队列分前端后后端,在后端加入元素,在前端删除元素

特点:先进先出

队列常用方法

  • enqueue(element): 向队列尾部添加一个新的项

  • dequeue(): 移除队列的第一项,并返回移除的元素

  • front(): 返回队列中第一个元素,不改变原队列

  • isEmpty(): true&false

  • size(): 元素个数

  • toString(): 将队列中的内容转为字符串形式

基于数组的队列封装

function Queue() {
  //属性
  this.items = []
  //方法
  Queue.prototype.enqueue = function(element) {
    this.items.push(element)
  }
  Queue.prototype.dequeue = function() {
    return this.items.shift()
  }
  Queue.prototype.front = function() {
    return this.items[0]
  }
  Queue.prototype.isEmpty = function() {
    return this.items.length == 0
  }
  Queue.prototype.size = function() {
    return this.items.length
  }
  Queue.prototype.toString = function() {
    let resString = ""
    for (const item of this.items) {
      resString += item + " "
    }
    return resString
  }
}

击鼓传花游戏的实现

在这里插入图片描述
代码实现

function passGame(nameList, num) {
  let queue = new Queue()
  //先将所有依次加入队列
  for (const item of nameList) {
    queue.enqueue(item)
  }

  //开始数数
  while(queue.size() > 1) {
    for(let i = 1;i < num;i ++) {
      queue.enqueue(queue.dequeue())
    }
    queue.dequeue()
  }
  let name = queue.front()
  console.log(name)
}
passGame([10,20,30,40],3)

优先级队列的实现

需要给队列中的每个项目添加一个priority,表示优先级高低

function PrioityQueue() {

  this.items = []

  function QueueElement(element, priority) {
    this.element = element
    this.priority = priority
  }

  PrioityQueue.prototype.enqueue = function (element, priority) {
    let queueElement = new QueueElement(element, priority)
    //判断队列是否未空
    if (this.items.length == 0) {
      this.items.push(queueElement)
    } else {
      let added = false
      for (let i = 0; i < this.items.length; i++) {
        if (queueElement.priority < this.items[i].priority) {
          this.items.splice(i, 0, queueElement)
          added = true
          break
        }
      }
      //不需要插入则直接放入最后
      if (!added) {
        this.items.push(queueElement)
      }
    }
  }
  PrioityQueue.prototype.dequeue = function () {
    return this.items.shift()
  }
  PrioityQueue.prototype.front = function () {
    return this.items[0]
  }
  PrioityQueue.prototype.isEmpty = function () {
    return this.items.length == 0
  }
  PrioityQueue.prototype.size = function () {
    return this.items.length
  }
  PrioityQueue.prototype.toString = function () {
    let resString = ""
    for (const item of this.items) {
      resString += item + " "
    }
    return resString
  }
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

boboj1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值