队列定义
队列是遵循FIFO(First In First Out,先进先出,也称为先来先服务)原则的一组有序的项。
队列在尾部添加新元素,并从顶部移除元素。最新添加的元素必须排在队列的末尾。
在现实中,最常见的队列的例子就是排队:
但是不能插队
下面我们来实现一个队列
//定义一个队列
function Queue(){
var items = []; // 存储数据
// 向队列尾部添加一个元素
this.enqueue = function(item){
items.push(item);
};
// 移除队列头部的元素
this.dequeue = function(){
return items.shift();
};
// 返回队列头部的元素
this.head = function(){
return items[0];
};
// 返回队列尾部的元素
this.tail = function(){
return items[items.length-1];
};
// 返回队列大小
this.size = function(){
return items.length;
};
// clear
this.clear = function(){
items = [];
};
// isEmpty 判断是否为空队列
this.isEmpty = function(){
return items.length == 0;
};
};
我们可以用队列来实现 约瑟夫环
//约瑟夫环
function del_ring(arr_list){
var queue=new Queue();
//将数组插入队列之中
for(var i=0;i<arr_list.length;i++){
queue.enqueue(arr_list[i]);
};
//定义一个参数 用来判断是否需要从队列顶部弹出
var index = 0;
//队列长度不为1一直循环
while(queue.size() != 1){
//弹出一个元素判断是否需要删除
var item=queue.dequeue();
//并且参数++
index++;
//判断与3取余不等于0,塞入队列尾部
if(index%3 != 0){
queue.enqueue(item);
}
}
//返回队列剩余元素
return queue.tail();
}
//造数据
var arr_list=[];
for(var i=0;i<100;i++){
arr_list.push(i);
}
console.log(del_ring(arr_list)); //90
用队列实现 斐波那契数列
//斐波那契数列
function feibonaqie(n){
if(n<0){
return false
}
if(n<3){
return 1
}
var queue = new Queue();
var index = 0;
//将两个1存入队列之中
queue.enqueue(1);
queue.enqueue(1);
//思路:队列中一直保存两个数
while(index<n-2){
var dequeue=queue.dequeue();
var head=queue.head();
var next=dequeue+head;
queue.enqueue(next);
index++
}
//反回队列尾部数字
return queue.tail();
}
console.log(feibonaqie(5))
以及 可以用队列实现一个杨辉三角
//for加队列实现杨辉三角 n表示行数
function yanghui(n){
var queue =new Queue();
queue.enqueue(1);
//控制层数
for(var i=1;i<=n;i++){
var line="";
var pre=0;
// 第二层for循环控制打印第 i 层
for(var j=1; j<=i;j++){
var item=queue.dequeue();
line+=item+"";
// 计算下一行的内容
var value=item+pre;
pre=item;
//存入的是下一行的数
queue.enqueue(value);
}
//每一层最后一个数字是1,上面的for循环没有计算最后一个数
queue.enqueue(1);
console.log(line);
}
}
yanghui(5);
//for+while实现
function yanghui2(n){
var queue = new Queue();
queue.enqueue(1);
queue.enqueue(0);
for(var i=1; i<=n; i++){
var line = "";
var pre = 0;
while(true){
var item = queue.dequeue();
// 用一个0把每一行的数据分割开,遇到0不输出,
if(item==0){
queue.enqueue(1);
queue.enqueue(0);
break
}else {
// 计算下一行的内容
line += item + " "
var value = item + pre;
pre = item;
queue.enqueue(value);
}
}
console.log(line);
}
}
而我们所用js事件循环就是用到的队列,当我们在浏览器中打开新标签时,就会创建一个任务队列。这是因为每个标签都是单线程处理所有的任务,它被称为事件循环。