队列
基本概念
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出**(FIFO—first in first out**)线性表
手动实现
本质上还是借助数组去实现,本着队列的基本原则先进先出的原则进行设计。
export default class Queue {
// 数据属性
items: any = [];
// 添加功能
enqueue(element: any) {
this.items.push(element);
}
// 删除功能,删除并返回头部元素,但是会影响一些性能
dequeue() {
return this.items.shift();
}
// 是否为空
isEmpty() {
return this.items.length === 0;
}
// 查看第一个元素
front() {
if (this.items.length === 0) {
return '队列为空';
} else {
return this.items[0];
}
}
// 长度方法
size() {
return this.items.length;
}
// toString方法,复杂结构不推荐使用
toString() {
let stackString = '';
for (let i = 0; i < this.items.length; i++) {
try {
if (typeof this.items[i] === 'object') {
// 排除复杂结构对该方法的影响
throw new Error();
}
stackString += this.items[i] + ' ';
} catch (e) {
console.error('复杂结构不允许使用该方法');
}
}
return stackString;
}
}
常见题目
/**
* 击鼓传花: 传入名单和暂停的数字,返回最后剩余人和在原列表中的下标
* @params 人员名单
* @params 暂停的数字
* @return 最后剩余人的下标
*/
export const passGame = (nameList: Array<{ name: string; id: number }>, num: number) => {
// 创建新的队列来完成目的
const queue = new Queue();
// 将传入的list装进队列中
for (let i = 0; i < nameList.length; i++) {
queue.enqueue(nameList[i]);
}
// 当队列大于1的时候都需要进行遍历
while (queue.size() > 1) {
// 小于num的时候,重新加入到队列末尾
for (let i = 0; i < num - 1; i++) {
queue.enqueue(queue.dequeue());
}
// 等于num这个人,直接从队列中删除掉
queue.dequeue();
}
// 返回最后的人
return nameList.indexOf(queue.front());
};