队列
- 队列是一种线性数据结构,用于存储一组有序的元素。
- 队列的元素遵循 FIFO(先进先出)的原则,即最先进入的元素最先出队列。
- 队列有两个基本操作:enqueue(入队)和 dequeue(出队)。
- 队列还有一个常用的操作:peek(查看队首元素)/front、 size(队列长度) 、isEmpty()、toString()。
队列的实现
function Queue() {
this.items = [];
// 1.将元素加入队列
Queue.prototype.enqueue = function (element) {
return this.items.push(element);
};
// 2.从队列中删除元素
Queue.prototype.dequeue = function () {
return this.items.shift();
};
// 3.查看前端的元素
Queue.prototype.peek = 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 () {
// 返回格式如: 10 20 30 等
let resString = this.items.join(" ");
return resString;
};
}
// test
const queue = new Queue();
queue.enqueue('10', '20', '30');
queue.size(); // 3
queue.dequeue(); // ['20', '30']
queue.peek(); // 20
常用算法:击鼓传花
const Queue = require("./queue");
/**
* 击鼓传花游戏规则:
* 几个朋友一起玩一个游戏,围成一圈,开始数数,数到某个数字的人自动淘汰
* 最后剩下的这个人会获得胜利,请问:最后胜利者原来在哪一个位置上
*/
let names = ["小明", "小红", "小亮"];
function passGame(nameList, stopNum = 1) {
let q = new Queue();
for (const item of nameList) {
q.enqueue(item);
}
while (q.size() > 1) {
for (let i = 0; i < stopNum - 1; i++) {
q.enqueue(q.dequeue());
}
q.dequeue();
}
console.log("最后剩下的人是:", q.front()); // 最后剩下的人是: 小红
return nameList.indexOf(q.front()); //返回对应的位置
}
console.log(passGame(names, 3)); // 1
常用算法-最近请求次数
var RecentCounter = function () {
this.queue = [];
};
/**
* @param {number} t
* @return {number}
*/
RecentCounter.prototype.ping = function (t) {
this.queue.push(t)
// 将3000ms之前的数据,踢出队列
while (this.queue[0] < t - 3000) {
this.queue.shift()
}
// 队列中剩下的元素个数就是最近的请求次数
return this.queue.length
};