当前位置: 首页 > 后端技术 > Node.js

你知道数据结构系列-队列篇

时间:2023-04-03 23:36:48 Node.js

有一天,当你回首走过的路,你会发现,这些年不断的奋斗,才是最美好的人生。——Floyd队列,英文FirstInFirstOut简称FIFO,遵循先进先出的原则,与“栈”相反,在队尾添加元素,在队头删除元素,如果有队列中没有元素称为空队列。对应生活场景的队列例子有很多。比如我们去火车站窗口买票,总是要排队。.另外,我们的订单超时队列,先到先得的事件抢购等等,队列在生活中的应用非常广泛。作者简介:MayJun,NodejsDeveloper,热爱技术,热爱分享的90后,公众号《Nodejs技术栈》,Github开源项目https://www.nodejs.redJavaScript数组实现提供的数组函数在queueJavaScript中可以实现一个简单的队列,使用起来非常方便。您只需要熟悉相关的API即可。下面看一下基于JS数组的入队出队过程的实现。上图展示了队列的初始化、入队、出队的过程。接下来我们通过JavaScript原型链的方式来实现。初始化队列,初始化一个存储队列中元素的数据结构。如果没有传入默认赋值空数组,如果传入需要先校验类型functionQueueStudy(elements){if(elements&&!(elementsinstanceofArray)){thrownewError('必须在数组格式!');}this.elements=元素||[];}向队列中添加元素实现一个enQueue方法,向队列中添加元素,注意只能在队列尾部添加,使用javascript数组中的push方法。QueueStudy.prototype.enQueue=function(element){this.elements.push(element);}队列移除元素实现了一个deQueue方法,将元素pop到队列头部,在JavaScript数组中使用shift方法。QueueStudy.prototype.deQueue=function(){returnthis.elements.shift();}通过JavaScript数组实现很简单,见https://github.com/Q-Angelo/project-training/tree/master源码为/algorithm/queue-js.jsPriorityqueue优先级队列,元素根据优先级进行增删改查。一个真实的例子是机场登机顺序。头等舱和商务舱乘客优先于经济舱乘客。在某些国家,老年人和孕妇(或有年幼子女的妇女)在登机时也享有优先于其他乘客登机的权利。对应我们生活场景的优先级队列的例子也有很多。比如我们去银行办理业务,一般都是先到先得的队列。会有提示,士兵可以优先等实现步骤核心实现仿照JavaScript数组实现队列的例子,对enqueue函数的修改如下:声明queueElement对象,里面包含要加入队列的元素.如果队列为空,则直接进入队列。如果发现优先级大于优先级的元素,则插入一个新元素。这里使用了JS数组中的拼接方法。最后,如果队列中所有元素的优先级都低于priority,则直接入队在队尾打印出方法也对代码示例做了简单修改PriorityQueue.prototype.enQueue=function(element,priority){constqueueElement={元素,优先级};如果(this.isEmpty()){返回this.elements.push(queueElement);}让添加=false;for(leti=0;iitem.element).join('|'));}运行测试constqueue=newPriorityQueue();queue.enQueue('普通会员1',5);queue.enQueue('普通会员2',10);queue.print()//普通会员1|普通会员2queue.enQueue('VIP会员1',3);queue.print()//VIP会员1|普通会员1|普通会员2queue.enQueue('VIP会员2',3);queue.print()//VIP会员1|VIP会员2|普通会员1|普通会员2queue.deQueue();queue.print()//VIP会员2|普通会员1|普通成员2图例展示下面以图例的形式展示了上述优先队列程序的运行过程。上面是将优先级最低的元素放在队列前面,调用了最小优先级队列和最大优先级队列的实现,参见https://github.com/Q-Angelo/project的源码-training/tree/master/algorithm/queue-priority.js循环队列有些地方也叫循环队列环形队列本身就是一个环形结构的队列。与普通队列相比,优点是第一个元素出队后,剩下的元素不需要依次前移,充分利用了向量空间。在下面的介绍中给出了完整的实现过程。在设计循环队列时,顺时针和逆时针方向都可以实现。进入队列时,可以按照(tail%capacity)规则将元素添加到队列尾部。tail表示队列尾部的指针,capacity表示容量,退出队列同样以(head%capacity)规则进行操作,head表示队列头指针,实现过程将以图文形式描述长度为6的队列。ES6实现循环队列下面使用EcameScript6的Class写法实现循环队列。需要做哪些点?需要实现的功能如下:创建队列,初始化队列空间,检查队列是否为空,检查队列是否溢出,入队,出队,清空队列,销毁队列,释放内存空间,遍历输出}this.capacity=容量;//初始化容量this[Init]();}/***清除队列,保留内存*/clear(){this[Init]()}[Init](){this.queue=newArray(this.capacity);//初始化队列内存空间this.队列长度=0;//初始化队列元素this.head=0;//队列头this.tail=0;//tail}/***队列是否为空*/isEmpty(){returnthis.queueLen===0?真假;}/***队列是否溢出*/isOverflow(){returnthis.queueLen===this.capacity}/***入队*/enQueue(element){if(this.isOverflow()){returnfalse;}this.queue[this.tail]=元素;这个尾巴++;this.tail=this.tail%this.capacity;这个.queueLen++;返回真;}/***dequeue*/deQueue(){if(this.isEmpty()){thrownewError('队列为空');}else{constelement=this.queue[this.head];这个头++;//移动队列头部的位置this.head=this.head%this.capacity;这个.queueLen--;返回元素;}}/***队列长度*/len(){returnthis.queueLen;}/***销毁队列,回收内存*/destroy(){this.queue=null;}/***队列元素遍历*/traversing(){console.log('------------遍历开始------------');for(leti=this.head;i