# 1. 前言

队列,是一种遵从先进先出(FIFO,First-In-First-Out)原则的有序集合。队列在尾部添加新元素,并从顶部移除元素,最新添加的元素必须排在队列的末尾。

# 2. 功能说明

  • enqueue(value):进队,添加一个新元素到队列末尾
  • dequeue():出队,移除队列中的第一个元素,同时返回该元素
  • front():获取队列中的第一个元素
  • isEmpty():判断队列是否为空。是返回 true,否返回 fallse
  • clear():清空队列里的元素
  • size():获取队列里元素的个数

# 3. 代码实现

首先,先创建一个类表示队列,并且初始化一个空数组,用来保存队列里的元素

class Queue {
  constructor() {
    this.items = [];
  }
}
1
2
3
4
5

接着,在这个队列类中实现所需要的功能:

class Queue {
  constructor() {
    this.items = [];
  }

  //进队,从队的尾部进入
  enqueue(value) {
    this.items.push(value);
  }

  //出队,从队的头部出
  dequeue() {
    return this.items.shift();
  }

  //获取队中的第一个元素
  front() {
    return this.items[0];
  }

  //判断队是否为空
  isEmpty() {
    return this.items.length === 0;
  }

  //获取队中元素的个数
  size() {
    return this.items.length;
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

# 4. 测试

在这里,我们可以利用队列模拟‘击鼓传花’的游戏:

/*
 *名称:击鼓传花
 *参数:nameArr,为一个数组,包含了参与该游戏的所有人员名字;
 *     num,击鼓的次数
 *返回:最终游戏胜利者的名字
 */
function JGCH(nameArr, num) {
  var queue = new Queue(); //实例化一个队列
  for (var i = 0; i < nameArr.length; i++) {
    queue.enqueue(nameArr[i]); //将传入的数组中的人员名字加入到队列中
  }
  var taotai = "";
  while (queue.size() > 1) {
    for (var i = 0; i < num; i++) {
      //每击一次鼓,将队列开头的一项移至队尾
      queue.enqueue(queue.dequeue());
    }
    //击鼓停止,拿着花的那个人即被淘汰,移出队列
    taotai = queue.dequeue();
    console.log(taotai + "被淘汰!!!");
  }
  //最后队列里剩下的那个人即为最终胜利者
  return queue.dequeue();
}
var nameArr = ["郭靖", "张无忌", "乔峰", "虚竹", "段誉"];
console.log("最终胜利者是:" + JGCH(nameArr, 10));
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26