除了了解编程语言外,您还必须了解如何组织数据,以便根据任务轻松高效地操作数据。这就是数据结构所做的。在这篇文章中,我将描述队列数据结构、它所具有的操作,并向您展示JavaScript中的队列实现。1.队列数据结构如果你喜欢旅行(比如我),你很可能会在机场办理登机手续。如果愿意值机的旅客多,值机柜台自然会排起长龙。刚进机场想值机的旅客进入队列,刚到服务台值机的旅客可以离队。这是一个真实的队列示例——队列数据结构的工作方式相同。队列是一种“先进先出”(FIFO)数据结构。第一个入队(输入)的项目是第一个出队(输出)的项目。在结构上,队列有2个指针。队列中最早排队的项目位于队列顶部,最新排队的项目位于队列末尾。2.队列中的操作队列主要支持入队和出队两种操作。此外,您可能会发现使用peek和length操作很有用。2.1入队操作入队操作在队尾插入一个项目。上图中的入队操作将第8个元素插入到尾部,8成为队列的尾部。queue.enqueue(8);2.2出队操作出队操作取出队头的项,队列中的下一项成为队头。上图中,dequeue操作返回并从队列中移除item7,dequeuing后item2成为新的head。queue.dequeue();//=>72.3Peek操作Peek操作读取队列的开头而不改变队列。上图中item7是队头,Peek操作只是返回队头——item7,并没有修改队列。queue.peek();//=>72.4队列长度length操作计算队列包含多少项。图中队列有4项:4、6、2、7,因此队列长度为4。queue.length;//=>42.5队列操作时间复杂度关于所有队列操作--enqueue,dequeue,peek和length——重要的是所有这些操作必须在常数时间O(1)内执行。恒定时间O(1)意味着无论队列的大小如何(它可以有10个或100万个项目):入队、出队、查看和长度操作必须在相对相同的时间内执行。3.在JavaScript中实现队列让我们看一下队列数据结构的可能实现,同时保持所有操作必须在常数时间O(1)内执行的要求。classQueue{constructor(){this.items={};this.headIndex=0;this.tailIndex=0;}enqueue(item){this.items[this.tailIndex]=item;this.tailIndex++;}dequeue(){constitem=this.items[this.headIndex];deletethis.items[this.headIndex];this.headIndex++;returnitem;}peek(){returnthis.items[this.headIndex];}getlength(){returnthis.tailIndex-this.headIndex;}}constqueue=newQueue();queue.enqueue(7);queue.enqueue(2);queue.enqueue(6);queue.enqueue(4);queue.dequeue();//=>7queue.peek();//=>2queue.length;//=>3试试demo.constqueue=newQueue()是创建队列实例的方式。调用queue.enqueue(7)方法会将项目7放入队列中。queue.dequeue()从队列中取出头项,而queue.peek()只是查看头项。最后,queue.length显示队列中剩余的项目数。队列方法复杂性Queue类的queue()、dequeue()、peek()和length()方法仅使用:属性访问器(如this.items[this.headIndex]),或执行算术运算(如this.headIndex++)因此,这些方法的时间复杂度都是常数时间O(1)。总结队列数据结构是一种“先进先出”(FIFO)类型:最早入队的项目是最早出队的项目。队列有两个主要操作:入队和出队。此外,队列可以有辅助操作,例如Peek和Length。所有队列操作必须在常数时间O(1)内执行。原文:https://dmitripavlutin.com/javascript-queue/作者:DmitriPavlutin
