队列
队列的概念
队列是是一种受限的线性表,特点为先进先出(FIFO:first in first out)。
- 受限之处在于它只允许在表的前端(front)进行删除操作;
- 在表的后端(rear)进行插入操作;
队列的应用:
- 打印队列:计算机打印多个文件的时候,需要排队打印;
- 线程队列:当开启多线程时,当新开启的线程所需的资源不足时就先放入线程队列,等待CPU处理;
队列类的实现:
队列的实现和栈一样,有两种方案:
- 基于数组实现;
- 基于链表实现;
队列的常见操作:
- enqueue(element):向队列尾部添加一个(或多个)新的项;
- dequeue():移除队列的第一(即排在队列最前面的)项,并返回被移除的元素;
- front():返回队列中的第一个元素——最先被添加,也将是最先被移除的元素。队列不做任何变动(不移除元素,只返回元素信息与Stack类的peek方法非常类似);
- isEmpty():如果队列中不包含任何元素,返回true,否则返回false;
- size():返回队列包含的元素个数,与数组的length属性类似;
- toString():将队列中的内容,转成字符串形式;
队列操作的实现
export default class Queue {
constructor() {
this.items = [];
}
// enqueue(item) 入队,将元素加入到队列中
enqueue(item) {
this.items.push(item);
}
// dequeue() 出队,从队列中删除队头元素,返回删除的那个元素
dequeue() {
return this.items.shift();
}
// front() 查看队列的队头元素
front() {
return this.items[0];
}
// isEmpty() 查看队列是否为空
isEmpty() {
return this.items.length === 0;
}
// size() 查看队列中元素的个数
size() {
return this.items.length;
}
// toString() 将队列中的元素以字符串形式返回
toString() {
let result = '';
for (let item of this.items) {
result += item + ' ';
}
return result;
}
}
案例
使用队列实现小游戏:击鼓传花,传入一组数据和设定的数字num,循环遍历数组内元素,遍历到的元素为指定数字num时将该元素删除,直至数组剩下一个元素。
// 利用队列结构的特点实现击鼓传花游戏求解方法的封装
export default function passGame(nameList, number) {
let queue = new Queue()
// 将数组中的数据,放在队列中
for(const item in nameList){
queue.enqueue(item)
}
let i =1
while(queue.size() > 1){
// 对1到number-1 的人执行出队再进队
for(let i =0;i<number-1;i++){
queue.enqueue(queue.dequeue())
}
// number这个人执行出队,不在进队
queue.dequeue();
}
// 将队列中剩下的人的值,根据数组找到原位置
return nameList.indexof(queue.dequeue)
}