一、定義
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~~