一、定義
1.1 背景
通過前面一節《JavaScript數據結構01 - 數組》我們知道,可以在數組的任意位置上刪除或添加元素。然而,有時候我們還需要一種在添加或刪除元素時有更多控制的數據結構。
有兩種數據結構類似於數組,但在添加和刪除元素時更爲可控。
它們就是棧和隊列。
1.2 概念
棧是一種遵循後進先出(LIFO)原則的有序集合。新添加的或待刪除的元素都保存在棧的末尾,稱作棧頂,另一端就叫棧底。
在棧裏,新元素都靠近棧頂,舊元素都接近棧底。
棧也被用在編程語言的編譯器和內存中保存變量、方法調用等,比如函數的調用棧。
二、棧的實現
2.1 創建一個類來表示棧
這裏我還是用構造函數的形式來書寫,大家有興趣可以用ES6的Class來重寫一遍。
// Stack類 function Stack () { this.items = []; this.push = push; this.pop = pop; this.peek = peek; this.isEmpty = isEmpty; this.clear = clear; this.size = size; this.print = print; } 複製代碼
棧裏面有一些聲明的方法:
- push(element):添加一個(或幾個)新元素到棧頂
- pop():移除棧頂的元素,同時返回被移除的元素
- peek():返回棧頂的元素,不對棧做任何修改
- isEmpty():如果棧裏沒有任何元素就返回true,否則返回false
- clear():移除棧裏的所有元素
- size():返回棧裏的元素個數
2.2 實現棧中的輔助方法
// 添加新元素到棧頂 function push (element) { this.items.push(element); } // 移除棧頂元素,同時返回被移除的元素 function pop () { return this.items.pop(); } // 查看棧頂元素 function peek () { return this.items[this.items.length - 1]; } // 判斷是否爲空棧 function isEmpty () { return this.items.length === 0; } // 清空棧 function clear () { this.items = []; } // 查詢棧的長度 function size () { return this.items.length; } // 打印棧裏的元素 function print () { console.log(this.items.toString()); } 複製代碼
2.3 創建實例進行測試
// 創建Stack實例 var stack = new Stack(); console.log(stack.isEmpty()); // true stack.push(5); // undefined stack.push(8); // undefined console.log(stack.peek()); // 8 stack.push(11); // undefined console.log(stack.size()); // 3 console.log(stack.isEmpty()); // false stack.push(15); // undefined stack.pop(); // 15 console.log(stack.size()); // 3 stack.print(); // 5,8,11 stack.clear(); // undefined console.log(stack.size()); // 0 複製代碼
三、結束
完整代碼可以到我的github倉庫查看,如果對你有幫助的話歡迎點一個Star~~