JavaScript數據結構《棧》

因爲不是計算機專業出身,對數據結構這些瞭解的比較少,最近看了一些相關的書籍,這裏作一些總結。本篇要說的是棧。咱們都知道數組是JavaScript裏面比較經常使用的一種數據結構,棧和數組相似,定義以下數組

棧是一種聽從後進先出 (LIFO) 原則的有序集合。 新增長和待刪除的元素都保存在棧的尾部,也稱棧頂,相反的另外一端就叫棧底,在棧的這種數據結構裏面,咱們新增的元素都在棧頂,舊的元素都在棧底。數據結構

舉一個生活中的例子,咱們平時吃完飯洗盤子的時候,咱們都會把洗好的盤子一個個堆疊起來,先放進去的盤子就是咱們棧裏面比較舊的元素(棧底),後放的盤子就是比較新的盤子(棧頂),而後咱們要把一個盤子拿下來的時候咱們都是從上面開始拿(棧頂),這裏就是後放進去的盤子先拿出來了,因此這裏就遵循了後進先出 (LIFO) 的原則了。this

代碼實現

代碼所有采用ES6的語法,首先咱們定義一個類Stack來表示棧,而後爲該類實現一些方法來模擬棧的行爲調試

class Stack {

  constructor() {
    // 定義一個數組來保存棧裏面的元素
    this.items = []
  }

  // 添加元素到棧頂
  push() { }
  // 從棧頂移除元素,同時返回被移除元素
  pop() { }
  // 返回棧頂的元素,不對棧自己作修改
  peek() { }
  // 判斷棧是否爲空
  isEmpty() { }
  // 清空棧
  remove() { }
  // 返回棧裏面元素的個數
  length() { }
}

這樣咱們就定義好一個基類了,下面來分別實現棧的行爲方法code

push

咱們要實現的第一個方法(行爲)就是push,push方法會向棧的棧頂新增元素,由於咱們是用數組來保存棧裏面的元素的,因此這個方法的實現很簡單,直接用JavaScript數組的push方法就行了。隊列

push(item) {
    this.items.push(item)
}

pop

接下來要實現是pop方法(行爲),pop會移除棧頂的元素而且會返回被移除的元素,這個方法咱們一樣能夠用JavaScript數組的pop方法來實現ip

pop() {
    return this.items.pop()
}

peek

peek方法(行爲)返回棧頂的最後一個元素,不對棧自己作修改,咱們能夠用Array.length-1來獲取數組的最後一個元素,因此peek方法能夠這樣寫rem

peek() {
    return this.items[this.items.length-1]
}

isEmpty

isEmpty方法用來判斷棧是否爲空,用數組來表示就是數組的 length 是否等於0,因此咱們能夠得出以下代碼it

isEmpty() {
    return this.items.length === 0
}

remove

remove 方法用來清空棧裏面全部的元素,實現這個方法是最簡單的了,直接讓數組等於一個新的空數組就行了console

remove() {
    this.items = []
}

length

最後要實現的是length方法,length方法返回棧的大小,這個一樣能夠用數組的length來實現

length() {
    return this.items.length
}

這裏咱們添加一個輔助print方法來打印棧裏面的元素,方便咱們觀察調試,這個方法和棧的行爲無關,只是一個輔助方法

print(){
    this.items.forEach((item, index) => {
        console.log(`${index+1}:${item}`)
    })
}

最後完整的代碼以下

class Stack {

  constructor() {
    this.items = []  // 定義一個數組來保存棧裏面的元素
  }
  // 添加元素到棧頂
  push(item) {
    this.items.push(item)
  }
  // 從棧頂移除元素,同時返回被移除元素
  pop() {
    return this.items.pop()
  }
  // 返回棧頂的元素,不對棧自己作修改
  peek() {
    return this.items[this.items.length-1]
  }
  // 判斷棧是否爲空
  isEmpty() {
    return this.items.length === 0
  }
  // 清空棧
  remove() {
    this.items = []
  }
  // 返回棧裏面元素的個數
  length() {
    return this.items.length
  }

  print() {
    this.items.forEach((item, index) => {
        console.log(`${index+1}:${item}`)
    })
  }
}

這樣這個棧就基本實現了,下面來實際運行一下實現好的這個Stack類,首先咱們須要實例化這個類,而後分別調用實例的方法來查看效果

const myStack = new Stack()  //  實例化

myStack.isEmpty() // true

myStack.push('這是棧的第一個元素') 
myStack.push('這是棧的第二個元素') 

myStack.print() // 1: 這是棧的第一個元素 2:這是棧的第二個元素

myStack.peek() // 這是棧的第二個元素

myStack.pop() // 這是棧的第一個元素

myStack.length() // 1

myStack.isEmpty() // false

myStack.remove() // 這時棧裏面已經沒有元素了

myStack.isEmpty() // true

棧的基本說明就到此了,下篇會總結一下和棧相似的數據結構,隊列。

相關文章
相關標籤/搜索