堆棧JavaScript數據結構

與數組相比,堆棧是一種具有更多限制的數據結構。

我們只能將項目添加到堆棧中,才能將它們添加到堆棧中。而且我們只能刪除堆棧頂部的項目。

像一堆書一樣思考它。您只能在頂部添加書,也只能刪除頂部的書。

因此,如果添加了一堆書,然後要訪問添加的第一本書,則首先需要刪除所有書,直到找到添加的書。

這個概念稱為先進先出(FILO)

儘管JavaScript中的數組是內置的,並且我們不需要構建它們,但我們必須實現堆棧。

我們將創建一個數據結構來封裝我們的數據,使其從外部無法訪問,並且我們僅允許push()將數據添加到堆棧的方法,以及pop()從堆棧中刪除數據的方法。

我們可以通過許多不同的方式來做到這一點。一種方法是使用類,特別是我要使用私人班級領域。私有類字段不是JavaScript標準的一部分然而,但自版本12起,它們在Chrome,Edge,Safari和Node.js中可用。仍希望在不久的將來在Firefox中不可用。

我為什麼要使用它們?因為它們使我們能夠非常輕鬆地封裝類的內部狀態並從外部保護它。

class Stack {
  #items = []
  push = (element) => this.#items.push(element)
  pop = () => this.#items.pop()
  isempty = () => this.#items.length === 0
  empty = () => (this.#items.length = 0)
  size = () => this.#items.length
}

我們有5種公開方法:pushpop從堆棧中添加/刪除,isempty檢查堆棧是否為空,empty清空堆棧,size獲取堆棧大小。

現在,我們可以從該類創建一個堆棧對象,並對其進行處理:

const stack = new Stack()
stack.push(1)
stack.push(2)
stack.push(3)
console.log(stack.size()) //3
console.log(stack.pop()) //[ 3 ]
console.log(stack.size()) //2

對於公共財產,一切都將以相同的方式工作:

class Stack {
  items = []
  push = (element) => this.items.push(element)
  pop = () => this.items.pop()
  isempty = () => this.items.length === 0
  empty = () => (this.items.length = 0)
  size = () => this.items.length
}

除了現在我們可以檢查items從外部:

const stack = new Stack()
stack.push(2)
console.log(stack.items) //[ 2 ]

而使用私有類屬性時,訪問stack.items會回來undefined

免費下載我的JavaScript初學者手冊


更多js教程: