要成爲一名優秀的開發人員,須要來自多個學科的知識。編程
然而,在瞭解編程語言的基礎上,你還必須瞭解如何組織數據,以便根據任務輕鬆有效地操做數據。這就是數據結構的做用。數據結構
在這篇文章中,我將描述隊列數據結構,其具備的操做以及向您展現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)
中執行。