成为一名优秀的程序员需要广博的知识。首先是了解您选择的编程语言。但是,在熟悉编程语言之后,还必须了解如何根据任务轻松高效地操作数据。这就是数据结构的用武之地。在本文中,我将描述队列数据结构:它有哪些操作以及如何在JavaScript中实现它。1.队列数据结构如果你喜欢四处旅游,那你肯定在火车站办过检票手续。如果上车的人很多,自然会排长队。刚进站的人加入队列。另一边,刚通过检票口的人陆续退了出来。这是一个队列的示例,其操作方式与队列数据结构相同。队列是一种遵循先进先出(FIFO)规则的数据结构。第一个进入队列(输入)的项目是第一个被出队(输出)的。队列有两个指针:队头和队尾。第一个进入待排队队列的项目在队首,最后一个待排队的项目在队尾。回头看看车站的例子,第一个检票员排在队伍的最前面。刚入队的人排在队尾。队列数据结构在高层次上,队列是一种允许您按顺序处理项目的数据结构。2.队列的操作队列支持两种主要的操作:enqueue和dequeue,以及peek和length操作。2.1队列操作队列操作在队列的末尾插入项目,使其成为队列的尾部。入队操作上图中的入队操作是在队尾插入8,然后8就成为队尾。queue.enqueue(8);2.2出队操作出队操作取出队列中的第一项,队列中的下一项成为队头。出队操作在上图中,出队操作返回项目7并将其从队列中移除。出队后,item2成为新的组长。queue.dequeue();//=>72.3Peek操作Peek操作读取队列头部的项,但不改变队列。上图中的Peek操作7是团队的领导者。peek操作只需要返回队列7的头部,并不修改队列。queue.peek();//=>72.4lengthlength操作返回队列中包含的项目数。上图中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;//=>3constqueue=newQueue()是创建队列的实例。queue.enqueue(7)方法入队7.queue.dequeue()从队列中移除头项,而queue.peek()只读取头项。最后的Queue.Length显示队列中剩余的项目数。关于实现:在Queue类中,普通对象this.Items通过数字索引保存队列的项目。队列头部的索引由Where.HeadInex跟踪,队列尾部由this.tailIndex跟踪。queue方法的复杂性存在于Queue的queue()、dequeue()、peek()和length()方法中:属性访问器(如:this.items[this.headIndex]),进行算术运算(如:this.headidex++)这些方法的时间复杂度是常数时间O(1)。4.总结队列是一种遵循先进先出(FIFO)规则的数据结构。队列有两个主要操作:入队和出队。此外,队列可以有辅助操作,例如peek和length。所有队列操作必须在常数时间O(1)内执行。作为挑战:改进dequeue()和peek()方法以在空队列上执行时抛出错误。
