js数组实现队列,JS异步队列
队列定义
队列是一种先进先出队列。一组有序的FIFO)原则。它和栈的区别在于栈是FIFO,队列是FIFO,栈是一端进一端出,队列是一端进一端出。堆栈删除在表的末尾执行,队列删除在表头执行。栈可以实现多栈空间共享,顺序队列不能。它们的共同点是只允许在端点插入和删除元素。多链栈和多链队列的管理方式可以相同。
栈(stack)定义
JavaScript是单线程语言,主线程执行同步代码。当一个函数被调用时,会在内存中形成一个“调用记录”,也称为“调用帧”,保存调用位置、内部变量等信息。如果在函数内部调用了其他函数,那么在调用记录上面会形成另一个调用记录,所有的调用记录会形成一个“调用栈”。(尾部调用,尾部递归优化)
堆(heap)定义
对象被分配在一个堆中,一个表示内存中一个大的无组织区域。
所以
JS是单线程。当主线程执行同步代码、事件、I/O操作等异步任务时,会进入任务队列执行。异步执行结果出来后,会变成等待状态,形成先入先出的执行堆栈。执行主线程的同步代码后,将从“任务队列”中读取事件,并回调事件异步任务。这就是为什么执行顺序是同步异步回调。简单来说,只要主线程是空的(同步),就会读取“任务队列”(异步)。这就是JavaScript的运行机制。
本文将实现基本队列、优先级队列和循环队列。
消息队列与事件循环事件循环
一个JavaScript运行时包含一个待处理的消息队列(异步任务),(里面是进入“任务队列”的任务,而不是主线程。如UI事件、ajax网络请求、定时器setTimeout和setInterval等。每条消息都与一个功能相关联(回调函数回调)。当堆栈为空时,从队列中取出一条消息进行处理。这个过程包括调用与这个消息相关的函数(从而创建一个初始堆栈帧)。当堆栈再次为空时,意味着消息处理的结束。
这个过程是无止境的,所以整个运行机制也叫事件循环(事件循环)。
基本队列
基本队列方法包括以下六种方法。
向队列(尾部)添加一个元素(入队)
删除元素(出列)(从队列的头部)
检查队列最前面的元素
检查队列是否为空(isEmpty)
检查队列长度(大小)
检查队列(打印)
函数队列(){
//初始化队列(使用数组实现)
var items=[];
//加入团队
this.enqueue=function (ele) {
items . push(ele);
};
//出列
this.dequeue=function () {
return items . shift();
};
//返回第一个元素
this.front=function () {
返回项目[0];
};
//队列是否为空?
this.isEmpty=function () {
返回items . length==0;
};
//清空队列
this.clear=function () {
items=[];
};
//返回队列长度
this.size=function () {
返回items.length
};
//检查队列
this.show=function () {
退货项目;
};
}
var Queue=new Queue();
queue . enqueue( hello );
queue . enqueue( world );
queue . enqueue( CSS );
queue . enqueue( JavaScript );
queue . enqueue( node . js );
console . log(queue . isempty());//假
console . log(queue . show());//hello,world,css3,javascript,node.js
console . log(queue . size());//5
console . log(queue . front());//你好
console . log(queue . dequeue());//你好
console . log(queue . show());//world , css , javascript , node.js
console . log(queue . clear());
console . log(queue . size());//0优先队列的实现
在优先级队列中,根据优先级添加或删除元素。优先级队列有两种实现方式:优先级添加和正常出列;正常添加,优先出列
一个添加的例子,通常是出队(最低优先级队列)(这个例子把添加到队列中的元素从普通数据改为对象(数组)类型,在实现队列的基础上包含要添加到队列中的元素的值和优先级):
函数PriorityQueue() {
//初始化队列(使用数组实现)
var items=[]
//因为有优先级,所以插入的队列要有优先级属性。
函数queueEle(ele,优先级){
this.ele=ele
优先权=优先权
}
//加入团队
this.enqueue=function (ele,priority) {
let元素=新队列Ele(ele,优先级)
//如果空白,直接加入团队。
if (this.isEmpty()) {
items.push(元素)
}
否则{
var qeueued=false//是否符合优先级要求,已经入队?
for(设I=0;I this . size();i ) {
if (element.priority items[i].优先级){
items.splice(i,0,element)
qeueued=true
打破;
}
}
//如果不符合要求,按要求加入队伍,那就直接从尾部加入队伍。
如果(!qeued)items . push(element)
}
}
//出列
this.dequeue=function () {
return items.shift()
}
//返回第一个元素
this.front=function () {
返回项目[0]
}
//队列是否为空?
this.isEmpty=function () {
返回项目。长度==0
}
//清空队列
this.clear=function () {
items=[]
}
//返回队列长度
this.size=function () {
返回项目.长度
}
//检查队列
this.show=function () {
退货项目
}
}
var priority queue=new priority queue();
PriorityQueue.enqueue(优先级2-1 ,2);
PriorityQueue.enqueue(优先级1-1 ,1);
PriorityQueue.enqueue(优先级1-2 ,1);
PriorityQueue.enqueue(优先级3-1 ,3);
PriorityQueue.enqueue(优先级2-2 ,2);
PriorityQueue.enqueue(优先级1-3 ,1);
priority queue . show();//按优先级顺序输出
//输出
[
0:队列Ele {ele:优先级1-1 ,优先级:1},
1:queueEle {ele:优先级1-2 ,优先级:1},
2:queueEle {ele:优先级1-3 ,优先级:1},
3:queueEle {ele:优先级2-1 ,优先级:2},
4:queueEle {ele:优先级2-2 ,优先级:2},
5:队列Ele {ele:优先级3-1 ,优先级:3}
]循环队列
可以用环形队列模拟传递包裹的游戏(约瑟夫环问题):一群孩子围成一个圈,一次传递N个数字。当他们停下来的时候,手里拿着花的孩子被淘汰,直到队伍里只剩下一个孩子,也就是胜利者。
循环,每次弹出一个孩子(从队列头),那么这个孩子就加到队列尾,循环N次。当循环停止时,队列头的孩子弹出(消除),直到队列中只剩下一个孩子。
函数队列(){
//初始化队列(使用数组实现)
var items=[];
//加入团队
this.enqueue=function (ele) {
items . push(ele);
};
//出列
this.dequeue=function () {
return items . shift();
};
//返回第一个元素
this.front=function () {
返回项目[0];
};
//队列是否为空?
this.isEmpty=function () {
返回items . length==0;
};
//清空队列
this.clear=function () {
items=[];
};
//返回队列长度
this.size=function () {
返回items.length
};
//检查队列
this.show=function () {
退货项目;
};
}
/**
*
* @param {list}个名称
* @ param {指定递送次数} num
*/
仅功能一(名称,数量){
var Queue=new Queue();
//所有列表都加入团队
names.forEach((name)={
queue.enqueue(名称);
});
//被淘汰者的姓名
var loser=“”;
//只要不止一个人,就会继续下去。
while (queue.size() 1) {
for(设I=0;i numi ) {
//每次重新加入队伍,这样总共循环了num次(传递包裹已经过了num次)。
queue . enqueue(queue . dequeue());
}
//次数到这里就用完了,下一个就出队了。
loser=queue . dequeue();
Console.log(失败者‘被淘汰’);
}
//这里只剩下一个人了
返回queue . dequeue();
}
Var names=[文科,张凡,秦军,秋秋,黄静];
var winner=onlyOne(人名,99);
Console.log(金马奖得主是:获奖者);推荐:JavaScript视频教程以上是js中实现队列(代码共享)的详细内容。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。