什么是队列?队列就是一个队伍。队列和栈一样,由一段连续的存储空间组成,是一个具有自身特殊规则的数据结构。我们说栈是后进先出的规则,队列刚好与之相反,是一个先进先出(FIFO,First In First Out)或者说后进后出(LILO,Last In Last Out)的数据结构。想象一下,在排队时是不是先来的就会先从队伍中出去呢?
队列是一种受限的数据结构,插入操作只能从一端操作,这一端叫作队尾;而移除操作也只能从另一端操作,这一端叫作队头。针对上面购买奶茶队伍的例子,排在收银员一端的就是队头,而新来的人则要排到队尾。
队列实现 基于数据实现 基于链表实现 封装方法测试 js function Queue() { this.items = [];
// 方法
// 1.元素加入队列
Queue.prototype.enqueue = function (item) {
this.items.push(item);
};
// 2.队列删除前端元素
Queue.prototype.dequeue = function () {
return this.items.shift();
};
// 3.查看前端的元素
Queue.prototype.front = function () {
if (this.items.length === 0) return;
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 () {
document.writeln(this.items.join(" ") + "<br/>");
return this.items.join(" ");
};
}
let queue = new Queue();
queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(3);
queue.enqueue(4);
queue.enqueue(5);
queue.enqueue(6);
console.log(queue.toString());
queue.dequeue();
3. 队列的笔试题
击鼓传花的规则
原游戏规则: 班级中玩一个游戏, 所有学生围成一圈, 从某位同学手里开始向旁边的同学传一束花. 这个时候某个人(比如班长), 在击鼓, 鼓声停下的一颗, 花落在谁手里, 谁就出来表演节目. 修改游戏规则: 几个朋友一起玩一个游戏, 围成一圈, 开始数数, 数到某个数字的人自动淘汰. 最后剩下的这个人会获得胜利, 请问最后剩下的是原来在哪一个位置上的人? 整个过程大致如下所示(名字红色的人被淘汰):
大致思路:
函数需要两个参数,一个是名字的数组,另外一个就是一个确定的数字num 最后队列中只会剩下一个人
所以当队列的长度大于1的时候进行循环
从0到num开始循环队列中的元素,如果小于num,从队首删除,移入队尾
如果等于num,则删除该元素
重复上面的循环,直至队列长度为1 大致代码如下:
//函数接受两个参数,姓名的数组和数字num
function playGames(nameList,num) {
//创建一个队列
var queue = new Queue();
//将所有人的名字放在列表当中
for(var i = 0 ; i < nameList.length ; i++) {
queue.enqueue(nameList[i]);
}
//队列长度大于1开始循环
while(queue.size() > 1) {
//从0到num开始循环,如果不等于num,从队首删除,移入队尾
for(let i = 0 ; i < num ; i++) {
//删除队首
var a = queue.dequeue();
//队首元素进入队尾
queue.enqueue(a);
}
//等于num之后,删除该元素
queue.dequeue()
}
//检查队列长度
console.log(queue.size());
//查看最后剩下的人
var endName = queue.font();
return endName
}
调用函数,查看最后的结果:
var name = playGames( ['荣','贵','生','欢','宇','彭'],4);
console.log(name); //荣
12
输出的结果为荣,和我们之前的分析结果一致
其他例子 如下 ?、
击鼓传花
击鼓传花是一个常见的面试算法题.使用队列可以非常方便的实现最终的结果
- 几个朋友一起玩一个游戏,围成一圈,开始数数,数到某个数字的人自动淘汰
- 最后剩下的这个人会获得胜利,请问最后剩下的是原来在哪一个位置上的人?
技巧: 封装一个基于队列的函数
- 参数:所有参与人的姓名,基于的数字
- 结果:最终剩下的一人的姓名
function PassGame(nameList,num){ //1-创建一个队列结构 var queue=new Queue()
//2-将队员名字压入队列中
for(var i=0;i<nameList.length;i++){ queue.enqueue(nameList[i]) } //3-开始进行游戏 数数字
while(queue.size()>1){ for (var i=0;i<num-1;i++){
//将数字之前 没被抓到的人 先从队列删除 在添加到队列 queue.enqueue(queue.dequeue()) } //将 数字为 num 的人 从队列中 删除
queue.dequeue() }
//4 获取最后一个人 var lastOne=queue.front() console.log('最后剩下的人是:'+lastOne) console.log(queue) console.log(queue.size()) console.log(nameList.indexOf(lastOne)) return nameList.indexOf(lastOne)
} names=['lilei','lihua','xiaohong','xiaowei','xiaokai'] PassGame(names,3)
function Queue() {
this.items=[]
//1.将元素压入队列中操作 Queue.prototype.enqueue = function (element) { this.items.push(element) }
//2.将最先进来的元素从队列中删除 跟pop相反
Queue.prototype.dequeue = function () { return this.items.shift() }
//3.查看队列中最前面的元素
Queue.prototype.front = 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 () { var result = ''
for (var i = 0; i < this.items.length; i++) {
result += this.items[i]
}
return result } }
最后剩下的人是:xiaowei
面试题击鼓传花. html:39 Queue {items: Array(1)}items: ['xiaowei']0: "xiaowei"length: 1[[Prototype]]: Array(0)[[Prototype]]: Object
面试题击鼓传花.html:40 1
面试题击鼓传花.html:41 3