队列 认识队列结构 传花规则 传花代码 !!!!

148 阅读3分钟

什么是队列?队列就是一个队伍。队列和一样,由一段连续的存储空间组成,是一个具有自身特殊规则的数据结构。我们说栈是后进先出的规则,队列刚好与之相反,是一个先进先出(FIFO,First In First Out)或者说后进后出(LILO,Last In Last Out)的数据结构。想象一下,在排队时是不是先来的就会先从队伍中出去呢?

队列是一种受限的数据结构,插入操作只能从一端操作,这一端叫作队尾;而移除操作也只能从另一端操作,这一端叫作队头。针对上面购买奶茶队伍的例子,排在收银员一端的就是队头,而新来的人则要排到队尾。

image.png

image.png

image.png

队列实现 基于数据实现 基于链表实现 封装方法测试 js function Queue() { this.items = [];

    // 方法
    // 1.元素加入队列
    Queue.prototype.enqueue = function (item) {
      this.items.push(item);
    };
    // 2.队列删除前端元素
    Queue.prototype.dequeue = function () {
      return this.items.shift();
    };
    // 3.查看前端的元素
    Queue.prototype.front = function () {
      if (this.items.length === 0) return;
      return this.items[0];
    };
    // 4.插卡队列是否为空
    Queue.prototype.isEmpty = function () {
      return this.items.length === 0;
    };
    // 5.查看队列中元素的个数
    Queue.prototype.size = function () {
      return this.items.length;
    };
    // 6.toString方法
    Queue.prototype.toString = function () {
      document.writeln(this.items.join(" ") + "<br/>");
      return this.items.join(" ");
    };
  }

  let queue = new Queue();
  queue.enqueue(1);
  queue.enqueue(2);
  queue.enqueue(3);
  queue.enqueue(4);
  queue.enqueue(5);
  queue.enqueue(6);
  console.log(queue.toString());

  queue.dequeue();
  
  
  
  3. 队列的笔试题

击鼓传花的规则

原游戏规则: 班级中玩一个游戏, 所有学生围成一圈, 从某位同学手里开始向旁边的同学传一束花. 这个时候某个人(比如班长), 在击鼓, 鼓声停下的一颗, 花落在谁手里, 谁就出来表演节目. 修改游戏规则: 几个朋友一起玩一个游戏, 围成一圈, 开始数数, 数到某个数字的人自动淘汰. 最后剩下的这个人会获得胜利, 请问最后剩下的是原来在哪一个位置上的人? 整个过程大致如下所示(名字红色的人被淘汰):

image.png

大致思路:

函数需要两个参数,一个是名字的数组,另外一个就是一个确定的数字num 最后队列中只会剩下一个人

所以当队列的长度大于1的时候进行循环

从0到num开始循环队列中的元素,如果小于num,从队首删除,移入队尾

如果等于num,则删除该元素

重复上面的循环,直至队列长度为1 大致代码如下:

//函数接受两个参数,姓名的数组和数字num
function playGames(nameList,num) {
  //创建一个队列
  var queue = new Queue();
  //将所有人的名字放在列表当中
  for(var i = 0 ; i < nameList.length ; i++) {
    queue.enqueue(nameList[i]);
  }
  //队列长度大于1开始循环
  while(queue.size() > 1) {
    //从0到num开始循环,如果不等于num,从队首删除,移入队尾
    for(let i = 0 ; i < num ; i++) {
      //删除队首
      var a = queue.dequeue();
      //队首元素进入队尾
      queue.enqueue(a);
    }
    //等于num之后,删除该元素
    queue.dequeue()
  }

  //检查队列长度
  console.log(queue.size());

  //查看最后剩下的人
  var endName = queue.font();
  return endName
}

调用函数,查看最后的结果:
   var name =  playGames( ['荣','贵','生','欢','宇','彭'],4);
   console.log(name);  //荣

12

输出的结果为,和我们之前的分析结果一致

其他例子 如下 ?、

image.png

image.png

击鼓传花

击鼓传花是一个常见的面试算法题.使用队列可以非常方便的实现最终的结果

  • 几个朋友一起玩一个游戏,围成一圈,开始数数,数到某个数字的人自动淘汰
  • 最后剩下的这个人会获得胜利,请问最后剩下的是原来在哪一个位置上的人?

技巧: 封装一个基于队列的函数

  • 参数:所有参与人的姓名,基于的数字
  • 结果:最终剩下的一人的姓名

image.png

image.png

function PassGame(nameList,num){ //1-创建一个队列结构 var queue=new Queue()

//2-将队员名字压入队列中

for(var i=0;i<nameList.length;i++){ queue.enqueue(nameList[i]) } //3-开始进行游戏 数数字

while(queue.size()>1){ for (var i=0;i<num-1;i++){

//将数字之前 没被抓到的人 先从队列删除 在添加到队列 queue.enqueue(queue.dequeue()) } //将 数字为 num 的人 从队列中 删除

queue.dequeue() }

//4 获取最后一个人 var lastOne=queue.front() console.log('最后剩下的人是:'+lastOne) console.log(queue) console.log(queue.size()) console.log(nameList.indexOf(lastOne)) return nameList.indexOf(lastOne)

} names=['lilei','lihua','xiaohong','xiaowei','xiaokai'] PassGame(names,3)

function Queue() {

this.items=[]

//1.将元素压入队列中操作 Queue.prototype.enqueue = function (element) { this.items.push(element) }

//2.将最先进来的元素从队列中删除 跟pop相反

Queue.prototype.dequeue = function () { return this.items.shift() }

//3.查看队列中最前面的元素

Queue.prototype.front = function () { return this.items[0] }

//4.判断队列是否为空 Queue.prototype.isEmpty = function () { return this.items.length == 0 }

//5.判断队列的长度

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

//6.toString类型 Queue.prototype.toString = function () { var result = ''

   for (var i = 0; i < this.items.length; i++) {
       result += this.items[i]
   }

return result } }

最后剩下的人是:xiaowei

面试题击鼓传花. html:39 Queue {items: Array(1)}items: ['xiaowei']0: "xiaowei"length: 1[[Prototype]]: Array(0)[[Prototype]]: Object

面试题击鼓传花.html:40 1

面试题击鼓传花.html:41 3