1.基本队列的实现:
基本队列的方法有:
1)向队尾添加元素(enqueue)
2)从对头删除元素(dequeue)
3)查看队列头部元素(front)
4)查看队列是否为空(isEmpty)
5)查看队列的长度(size)
6)查看队列(print)
function Queue(){
//使用数组初始化队列
var items=[];
//向队列插入元素
this.enqueue=function(elem){
items.push(elem);
}
//从队头删除元素
this.dequeue=function(){
return items.shift();
}
//查看对头元素
this.front=function(){
return items[0];
}
//判断队列是否为空
this.isEmpty=function(){
return items.length==0;
}
//查看队列的长度
this.size=function(){
return items.length;
}
//查看队列
this.print=function(){
return items.toString();
}
}
可以使用循环队列来模拟击鼓传花的游戏(约瑟夫环问题):一群孩子围成一圈,每次传递 n 个数,停下来时手里拿花的孩子被淘汰,直到队伍中只剩下一个孩子,即胜利者。
循环队列,每次循环的时候(从队列头部)弹出一个孩子,再把这个孩子加入到队列的尾部,循环 n 次,循环停止时弹出队列头部的孩子(被淘汰),直到队列中只剩下一个孩子。
function circularQueue(arr,n){
//实例化一个队列
var queue=new Queue();
//将孩子加入到对列中
for(var i=0;i<arr.length;i++){
queue.enqueue(arr[i]);
}
当队列的长度大于1时执行循环
while(queue.size()>1){
//将第n个前面的数依次从对队尾插入
for(var j=0;j<n-1;j++){
queue.enqueue(queue.dequeue());
}
//删除n个数
queue.dequeue();
}
//返回剩余的一个数
return queue.dequeue();
}
对于上述问题不适用队列,但是原理和队列是一样的方法
function circleQueue(arr,n){
if(arr.length>=m){
while(arr.length>=m){
arr=arr.slice(m).concat(arr.slice(0,m-1));
}
}
while(arr.length>1){
var i=m%arr.length;
arr=i>1?arr.slice(i).concat(arr.slice(0,i-1)):arr.slice(i);
}
console.log(arr[0]);
}
或者:
function circleQueue(arr,n){
while(arr.length>1){
for(var i=0;i<n-1;i++){
arr.push(arr.shift());
}
arr.shift();
}
console.log(arr[0]);
}