对列,刚好和栈相反,它是先进先出的,只允许在队列的一头添加元素,另一头删除元素
class queue{
constructor(){
this.arr=[];
}
//插入元素
enqueue(ele){
this.arr.push(ele);
}
//删除元素
dequeue(){
return this.arr.shift();
}
//获取第一个元素
find(){
return this.arr[0];
}
//获得队列长度
getLength(){
return this.arr.length;
}
//获取队尾元素
next(){
return this.arr[this.arr.length-1];
}
//清空队列
clear(){
this.arr=[];
}
//判断是否为空
isEmpty(){
return this.arr.length===0
}
}
下面看下队列的应用,首先是约瑟夫环,把0-99依次插入队列,然后从0开始每隔2个数删除一个数,到对尾时再返回到对头重新开始,判断最后一个元素是哪个,下面来看下代码
var q=new queue();
for(var i=0;i<100;i++){
q.enqueue(i);
}
var index=0;
while(q.getLength()>1){
var item=q.dequeue()
index++;
if(index%3!==0){//如果队列的下标不是3的倍数,就把它重新插入队尾
q.enqueue(item)
}
}
console.log(q.find())//90
最后的结果是90
然后是斐波那契数列,即第3个数等于前两个数相加的和,如1,1,2,3...等等,下面来看下代码
function num(n){
var index=0;
var q=new queue();
q.enqueue(1);
q.enqueue(1);
while(index<n-2){
var item=q.dequeue();
var item1=q.find();
var x=item+item1;
q.enqueue(x);
index+=1;
}
q.dequeue();
console.log(q.find())
}
num(4)//3
它是先获取并删除对头元素,然后再与队列的对头元素相加,再插入队列中,最后在删除对头元素,这样在队列里的对头元素就是斐波那契数列中要求的第几项