因爲不是計算機專業出身,對數據結構這些瞭解的比較少,最近看了一些相關的書籍,這裏作一些總結。本篇要說的是棧。咱們都知道數組是JavaScript裏面比較經常使用的一種數據結構,棧和數組相似,定義以下數組
棧是一種聽從後進先出 (LIFO) 原則的有序集合。 新增長和待刪除的元素都保存在棧的尾部,也稱棧頂,相反的另外一端就叫棧底,在棧的這種數據結構裏面,咱們新增的元素都在棧頂,舊的元素都在棧底。數據結構
舉一個生活中的例子,咱們平時吃完飯洗盤子的時候,咱們都會把洗好的盤子一個個堆疊起來,先放進去的盤子就是咱們棧裏面比較舊的元素(棧底),後放的盤子就是比較新的盤子(棧頂),而後咱們要把一個盤子拿下來的時候咱們都是從上面開始拿(棧頂),這裏就是後放進去的盤子先拿出來了,因此這裏就遵循了後進先出 (LIFO) 的原則了。this
代碼所有采用ES6的語法,首先咱們定義一個類Stack
來表示棧,而後爲該類實現一些方法來模擬棧的行爲調試
class Stack { constructor() { // 定義一個數組來保存棧裏面的元素 this.items = [] } // 添加元素到棧頂 push() { } // 從棧頂移除元素,同時返回被移除元素 pop() { } // 返回棧頂的元素,不對棧自己作修改 peek() { } // 判斷棧是否爲空 isEmpty() { } // 清空棧 remove() { } // 返回棧裏面元素的個數 length() { } }
這樣咱們就定義好一個基類了,下面來分別實現棧的行爲方法code
咱們要實現的第一個方法(行爲)就是push,push方法會向棧的棧頂新增元素,由於咱們是用數組來保存棧裏面的元素的,因此這個方法的實現很簡單,直接用JavaScript數組的push方法就行了。隊列
push(item) { this.items.push(item) }
接下來要實現是pop方法(行爲),pop會移除棧頂的元素而且會返回被移除的元素,這個方法咱們一樣能夠用JavaScript數組的pop方法來實現ip
pop() { return this.items.pop() }
peek方法(行爲)返回棧頂的最後一個元素,不對棧自己作修改,咱們能夠用Array.length-1
來獲取數組的最後一個元素,因此peek方法能夠這樣寫rem
peek() { return this.items[this.items.length-1] }
isEmpty方法用來判斷棧是否爲空,用數組來表示就是數組的 length 是否等於0,因此咱們能夠得出以下代碼it
isEmpty() { return this.items.length === 0 }
remove 方法用來清空棧裏面全部的元素,實現這個方法是最簡單的了,直接讓數組等於一個新的空數組就行了console
remove() { this.items = [] }
最後要實現的是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
棧的基本說明就到此了,下篇會總結一下和棧相似的數據結構,隊列。