如何在JavaScript中實現隊列數據結構

要成爲一名優秀的開發人員,須要來自多個學科的知識。編程

然而,在瞭解編程語言的基礎上,你還必須瞭解如何組織數據,以便根據任務輕鬆有效地操做數據。這就是數據結構的做用。數據結構

在這篇文章中,我將描述隊列數據結構,其具備的操做以及向您展現JavaScript中的隊列實現。編程語言

1.隊列數據結構

若是你喜歡旅行(像我同樣),極可能你在機場經過了辦理登機手續。若是有不少旅客願意辦理登機手續,天然就會在值機櫃臺前排起長龍。this

剛進入機場並想要辦理登機手續的旅客將排隊進入隊列,而剛剛在服務檯辦理了登機手續的旅客則能夠離開隊列。spa

這是隊列的真實示例—隊列數據結構以相同的方式工做。.net

隊列是一種「先入先出」(FIFO)數據結構的類型。入隊(輸入)的第一項是要出隊(輸出)的第一項。指針

從結構上說,一個隊列有2個指針。隊列中最先的排隊項目位於隊列的頂部,而最新隊列的項目位於隊列的末尾。code

2.隊列中的操做

隊列主要支持兩種操做:入隊列(enqueue)和出隊列(dequeue)。此外,您可能會發現使用peek和length操做很是有用。隊列

2.1 入隊操做

入隊操做在隊列尾部插入一個項目。圖片

上圖中的入隊操做將項目 8 插入尾部,8 成爲隊列的尾部。

queue.enqueue(8);

2.2 出隊操做

出隊操做提取隊列頭部的項,隊列中的下一項成爲頭。

在上面的圖片中,出隊操做從隊列中返回並刪除項目 7,在退出隊列後,項目 2 成爲新的頭。

queue.dequeue(); // => 7

2.3 Peek操做

Peek操做讀取隊列的開頭,而不會更改隊列。

項目 7 是上圖中隊列的頭部,Peek操做只是返回隊列的頭部——第 7 項,而不修改隊列。

queue.peek(); // => 7

2.4 隊列長度

長度操做計算隊列包含多少個項目。

圖片中的隊列有4個項目:4627。所以,隊列長度爲 4

queue.length; // => 4

2.5 隊列操做時間複雜度

關於全部的隊列操做--enqueue、dequeue、peek和length——重要的是,全部這些操做必須在恆定的時間內 O(1) 執行。

恆定的時間 O(1) 意味着不管隊列的大小(它能夠有10個或100萬個項目):enqueue、dequeue、peek和length操做必須在相對相同的時間內執行。

3.在JavaScript中實現隊列

讓咱們看一下隊列數據結構的可能實現,同時維持全部操做必須在恆定時間 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

Try the demo.

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) 中執行。

相關文章
相關標籤/搜索