javascript:数据结构——队列

什么是对列

是一种“先进先出”的数据结构。(如排队候车,肯定是先排队的人先上车)
在这里插入图片描述

实际用处

如打印机

队列操作

在这里插入图片描述

使用数组实现队列结构

在这里插入图片描述

使用类封装队列操作

const Queue = function () {
        
  const items = []; //私有的,只能在函数内部十使用,外部访问不到
  // this.items = [];//共有的,外部可以访问

  // 入队
  this.enQueue = function (element) {
    items.push(element)
  }

  // 出队
  this.deQueue = function(){
    // 这里使用 return 是为了返回删除的元素
    return items.shift()
  }

  // 查看列头
  this.front = function(){
    return items[0]
  }

  // isEmpty 队列是否为空(一般is开头命名的返回Boolean类型)
  this.isEmpty = function(){
    return items.length == 0
  }

  // size 检查队列元素个数
  this.size = function(){
    return items.length
  }

  // 检查items
  this.getItems = function(){
    return items
  }
}

使用队列实现击鼓传花例子

问题:假设有a,b,c,d,e,f等玩家在玩游戏,当花每传到第三个人的时候,就淘汰当前的这个人,到最后剩的最后一个玩家为赢家
解释:
游戏开始是从a开始的
红色是第一轮 淘汰的是c f ,留下的是a b d e ,当前小花在a玩家手里,a是当前传到的第一个人
在这里插入图片描述

绿色是第二轮 淘汰的是d ,留下的是a b e ,当前小花在a玩家手里,a是当前传到的第一个人
在这里插入图片描述

橙色是第三轮 淘汰的是b ,留下的是a e ,当前小花在a玩家手里 a是当前传到的第二个人
在这里插入图片描述

灰色是第四轮 淘汰的是e ,留下的是a
在这里插入图片描述

所以最后的赢家是a
按照队列的思路:把玩家每次是3的放在队列的第一个,并且踢它出局,第一个第二个就放在队列的最后。
在这里插入图片描述

依次论推。。。。。
结果还是一样,最后的赢家是a玩家
废话不多说,上代码

//参数一:玩家列表
//参数二:传的数字
const flowers = function (wanjia, num) {

  // 把所有的玩家放在一个队列中
  var queue = new Queue();
  wanjia.map(item => {
    queue.enQueue(item)
  })

  var taotai;
  while (queue.size() > 1) {
    // 把拿到不等于num的玩家,重新放在队列的最后
    for (let i = 1; i < num; i++) {
      queue.enQueue(queue.deQueue())
    }
    // 把拿到等于num的玩家出队(淘汰的玩家)
    taotai = queue.deQueue();
    console.log("淘汰的玩家是:", taotai);

  }

  // return 最后的赢家
  return queue.deQueue()

}

在这里插入图片描述

优先队列

什么是优先队列?
比如我们住酒店上电梯,所有人都在排队,但是酒店会员(vip)他们就有权限优先上电梯
在比如在机场登机,vip会员就有权限优先登机等。

const PriorityQueue = function () {

  const items = [];

  // 定义一个辅助类,用来生成对象(构造器)
  this.itemQueue = function (element, vipnumber) {
    this.element = element
    this.vipnumber = vipnumber
  }

  // 入列
  this.enQueue = function (element, vipnumber) {//vipnumber相当等级,等级越高优先级越高
    const itemqueue = new itemQueue(element, vipnumber);
    const whether = false
    for (let i = 0; i < items.length; i++) {
      if (items[i].vipnumber < itemqueue.vipnumber) {
        items.splice(i,0,itemqueue);
        whether = true;
        break; //跳出循环
      }
    }

   if(!whether){
      items.push(itemqueue)
    }
  }

  // 返回items
  this.getItems  = function(){
    return items
  }
}

// 辅助类用来生成对象
const itemQueue = function (element, vipnumber) {
  this.element = element
  this.vipnumber = vipnumber
}

let itemqueue = new itemQueue("张参", 18)
console.log(itemqueue1); //{element: '张参1', vipnumber: 18}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值