要成为一名优秀的开发人员,须要来自多个学科的知识。编程
然而,在了解编程语言的基础上,你还必须了解如何组织数据,以便根据任务轻松有效地操做数据。这就是数据结构的做用。数据结构
在这篇文章中,我将描述队列数据结构,其具备的操做以及向您展现JavaScript中的队列实现。编程语言
若是你喜欢旅行(像我同样),极可能你在机场经过了办理登机手续。若是有不少旅客愿意办理登机手续,天然就会在值机柜台前排起长龙。this
刚进入机场并想要办理登机手续的旅客将排队进入队列,而刚刚在服务台办理了登机手续的旅客则能够离开队列。spa
这是队列的真实示例—队列数据结构以相同的方式工做。.net
队列是一种“先入先出”(FIFO)数据结构的类型。入队(输入)的第一项是要出队(输出)的第一项。指针
从结构上说,一个队列有2个指针。队列中最先的排队项目位于队列的顶部,而最新队列的项目位于队列的末尾。code
队列主要支持两种操做:入队列(enqueue)和出队列(dequeue)。此外,您可能会发现使用peek和length操做很是有用。队列
入队操做在队列尾部插入一个项目。图片
上图中的入队操做将项目 8
插入尾部,8
成为队列的尾部。
queue.enqueue(8);
出队操做提取队列头部的项,队列中的下一项成为头。
在上面的图片中,出队操做从队列中返回并删除项目 7
,在退出队列后,项目 2
成为新的头。
queue.dequeue(); // => 7
Peek操做读取队列的开头,而不会更改队列。
项目 7
是上图中队列的头部,Peek操做只是返回队列的头部——第 7
项,而不修改队列。
queue.peek(); // => 7
长度操做计算队列包含多少个项目。
图片中的队列有4个项目:4
、6
、2
和 7
。所以,队列长度为 4
。
queue.length; // => 4
关于全部的队列操做--enqueue、dequeue、peek和length——重要的是,全部这些操做必须在恒定的时间内 O(1)
执行。
恒定的时间 O(1)
意味着不管队列的大小(它能够有10个或100万个项目):enqueue、dequeue、peek和length操做必须在相对相同的时间内执行。
让咱们看一下队列数据结构的可能实现,同时维持全部操做必须在恒定时间 O(1)
中执行的要求。
class Queue { constructor() { this.items = {}; this.headIndex = 0; this.tailIndex = 0; } enqueue(item) { this.items[this.tailIndex] = item; this.tailIndex++; } dequeue() { const item = this.items[this.headIndex]; delete this.items[this.headIndex]; this.headIndex++; return item; } peek() { return this.items[this.headIndex]; } get length() { return this.tailIndex - this.headIndex; } } const queue = new Queue(); queue.enqueue(7); queue.enqueue(2); queue.enqueue(6); queue.enqueue(4); queue.dequeue(); // => 7 queue.peek(); // => 2 queue.length; // => 3
const queue = new Queue()
是建立队列实例的方式。
调用 queue.enqueue(7)
方法会将项目7排队到队列中。
queue.dequeue()
从队列中去队列一个头部的项目,而 queue.peek()
只是Peek头部的项目。
最后,queue.length
显示队列中还有多少项目。
Queue类的 queue()
、dequeue()
、peek()
和 length()
方法仅使用:
this.items[this.headIndex]
),this.headIndex++
)所以,这些方法的时间复杂度是恒定时间 O(1)
。
队列数据结构是“先入先出”(FIFO)的一种:最先入队的项是最先出队的项。
队列有2个主要操做:入队和出队。另外,队列能够具备辅助操做,例如Peek和长度。
全部队列操做必须在恒定时间 O(1)
中执行。