目录
1、什么是队列?
队列(Queue)是一种特殊的线性表,先进先出(FIFO,First In First Out)
特殊之处在于它只允许在表的前端(front)进行删除操作,
而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。
进行插入操作的端称为队尾,进行删除操作的端称为队头。
2、队列的封装
function Queue(){
// 属性
this.items = [];
// 对象内称之为方法,而不是函数
// Methods: 和某一个对象实例有联系
// function:
// this.push = function(this){
// }
// 需要利用原型,这种方法是共享的,也会节省更多的内存空间并且效率更高一点,相当于给整个类添加一个方法,而上面的方式相当于给某一个对象的实例添加一个方法,在JavaScript中是基于对象。
// 队列的相关操作
// 1、封装push函数,将元素加入到队列中。
Queue.prototype.enqueue = function(element){
this.items.push(element);
}
// 2、从队列中删除前端的元素
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 resultString = '';
for (var i = 0; i < this.items.length; i++) {
resultString += this.items[i] + ' ';
}
return resultString;
}
}
3、队列的检验
var q = new Queue();
// 依次放入20 100 10 60
q.enqueue(20);
q.enqueue(100);
q.enqueue(10);
q.enqueue(60); //20 100 10 60
// 输出队列
alert(q);
// 删除前端的一个元素
q.dequeue(); //100 10 60
alert(q);
// 获取队头的一个元素
alert(q.front()); //100
// 获取队列的大小
alert(q.size()); //3
alert(q.toString()); //100 10 60
// 判断队列是否为空
alert(q.isEmpty()); //false
4、队列的应用
击鼓传花。
原始游戏规则:有N个人围成一个圈传一束花,有一个人在旁边击鼓,当鼓声停止时,花落在谁的手上谁就淘汰,最后留下来的那个人就获胜。
改编规则: 有N个人围成一个圈从1开始报数,规定当报到数字k的人淘汰,下一轮从1开始,最后留下来的那个人就获胜。
代码实现:
function Queue(){
// 属性
this.items = [];
// 队列的相关操作
// 1、封装push函数,将元素加入到队列中。
Queue.prototype.enqueue = function(element){
this.items.push(element);
};
// 2、从队列中删除前端的元素
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 resultString = '';
for (var i = 0; i < this.items.length; i++) {
resultString += this.items[i] + ' ';
}
return resultString;
};
}
// 实现击鼓传花的代码
function passGrame(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){
// 3.1、将每一次前端移除的人排到队列的后端
for (var i = 0; i < num - 1; i++) {
queue.enqueue(queue.dequeue());
}
// 3.2、每数到数字num的时候就删除
queue.dequeue();
}
alert(queue.size());
var endName = queue.front();
alert('最后剩下来的人' + endName);
// 4、返回最后剩下的那个人
return nameList.indexOf(endName);
}
var nameList = ['Lily', 'Lucy', 'Tom', 'Lilei', 'Petter'];
alert(passGrame(nameList,3));
总结:与栈不同的是,队列出队是在队头,而栈是在栈顶。