JS数据结构(3)——队列
队列(Queue)是一种 **FIFO(First-In-First-Out,先进先出)**的数据结构。
队列和栈一样,也是一种 受限的线性表,它的限制是仅允许在表的前端(front)进行删除,在表的后端(rear)进行插入。进行插入操作的端称为 队尾,进行删除操作的称为 队头。
队列的结构
创建队列
function Queue() {
this.items = [];
// 入队
Queue.prototype.enQueue = function(element) {
this.items.push(element);
}
// 出队
Queue.prototype.deQueue = function() {
return this.items.shift();
}
// 查看队头的元素
Queue.prototype.front = function() {
return this.items[0];
}
// 判断队列是否为空
Queue.prototype.isEmpty = function() {
return this.items.length == 0;
}
// 查看队列中元素的个数
Queue.prototype.size = function() {
return this.items.length;
}
// 把队列中的元素以字符串形式返回
Queue.prototype.toString = function() {
var result = "";
for(var i = 0; i < this.items.length; i++)
result += this.items[i] + " ";
return result;
}
}
队列的使用
// 使用队列
var q = new Queue();
//入队
q.enQueue(111);
q.enQueue(222);
q.enQueue(333);
q.enQueue(999);
q.enQueue(1000);
console.log(q); // 结果:Queue { items: [ 111, 222, 333, 999, 1000 ] }
// 出队
q.deQueue();
q.deQueue();
console.log(q); // 结果:Queue { items: [ 333, 999, 1000 ] }
// 查看队头元素
console.log(q.front()); // 结果:333
console.log(q); // 结果:Queue { items: [ 333, 999, 1000 ] }
console.log(q.isEmpty()); // 结果:false
console.log(q.size()); // 结果:3
console.log(q.toString()); // 结果:333 999 1000
队列的应用
击鼓传花:
规则:几个朋友一起玩游戏,围成一圈,开始数数,数到某个数字的人自动淘汰,最后剩下的几个人继续以同样的数字玩游戏。
请问最后剩下的人是原来在哪一个位置上的人?
function passFlower(nameList, number) {
// 创建队列
var q = new Queue();
// 将所有人依次加入到队列中
for (var i = 0; i< nameList.length; i++)
q.enQueue(nameList[i]);
console.log(q.size());
while(q.size() > 1){
// 开始数数,不是number号的话,将其删除,重新加入到队列的末尾,是num的话直接将其删除
for (var i = 0; i < number - 1; i++)
q.enQueue(q.deQueue());
q.deQueue();
}
// 获取最后剩下的那个人
console.log("最终获胜的人: "+ q.front()); // 结果:最终获胜的人: HiHi
return nameList.indexOf(q.front());
}
// 测试
var names = ['PiPi', 'ChCh', 'FaFa', 'HiHi', 'LoLo'];
console.log(passFlower(names,3)); // 结果:3