js数组实现队列,JS异步队列

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • slice 数组,js中的slice()方法,JS数组方法slice()用法实例分析
  • js数组转字符串,字符串转数组方法,JS 数组转字符串
  • js数组转字符串,字符串转数组方法,JS 数组转字符串,JS数组转字符串实现方法解析
  • js数组筛选的方法,js 多条件筛选
  • js数组筛选的方法,js 多条件筛选,JS实现数组过滤从简单到多条件筛选
  • js数组的常用10种方法详解图,js数组的常用10种方法详解图片
  • js数组的常用10种方法详解图,js数组的常用10种方法详解图片,JS数组的常用10种方法详解
  • js数组去重的几种方式,js数组去重最简单的方法
  • js数组去重的几种方式,js数组去重最简单的方法,js数组去重的11种方法
  • js数组去重最简单的方法,数组去重方法js
  • js数组去重最简单的方法,数组去重方法js,七种JS实现数组去重的方式
  • js数组中去除重复值的几种方法是什么,js数组中去除重复值的几种方法有哪些
  • js数组中去除重复值的几种方法是什么,js数组中去除重复值的几种方法有哪些,js数组中去除重复值的几种方法
  • js初始化一个数组,js数组初始化的三种方式
  • js初始化一个数组,js数组初始化的三种方式,js二维数组定义和初始化的三种方法总结
  • 留言与评论(共有 条评论)
       
    验证码: