棧的實現(JavaScript)
阿新 • • 發佈:2021-01-13
棧的資料結構
棧
是一種遵循一種後進先出(LIFO)原則的有序集合。
後進先出(LIFO)
即新新增或待刪除的元素都會儲存到棧的一端,這一端稱為棧頂,另一端稱為棧低。
由於要遵循LIPO原則,需要對元素的插入和刪除功能進行限制,所以我們需要宣告以下方法:
push(element)
:新增一個或多個元素
pop()
:移除棧頂元素
peek()
:返回棧頂元素,不做修改
isEmpty()
:判斷棧是否為空
clear()
:清空棧
size()
:返回棧元素的個數
下面寫一個用WeakMap的方法來實現:
//使用WeakMap方法來實現Stack
const items = new WeakMap();//宣告一個WeakMap型別的變數items
//建立一個類來表示棧
class Stack {
constructor(element) {
items.set(this,[]);//在constructor中,以this(Stack類自己的引用)為鍵,把代表棧的陣列存入items
}
//新增新元素的方法
push(element){
const s = items.get(this);//定義一個s來表示Stack中的items
s.push(element);//進行新增
}
//移除棧頂元素的方法
pop(){
const s = items.get(this);
const res = s.pop();
return res;
}
//返回棧頂元素的方法
peek(){
const s = items.get(this);
return s[s.length - 1];
}
//判斷棧是否為空的方法
isEmpty(){
const s = items.get(this);
return s.length === 0;
}
//清空棧的方法
clear(){
const s = items.get(this);
s = [];
}
//判斷棧長度大小的方法
size(){
const s = items.get(this);
return s.length;
}
//打印出棧的內容的方法
toString(){
const s = items.get(this);
if(this.isEmpty())
return undefined;
let objString = `${s[0]}`;
for(let i = 1; i < s.length; i++){
objString = `${objString} , ${s[i]}`;
}
return objString;
}
}
用WeakMap實現類的好處就是可以確保屬性是私有的,因為我們希望Stack類中只能訪問在類中暴露的方法,並不希望棧也就是items可以被訪問;但是用WeakMap程式碼的可讀性並不高,而且在擴充套件該類時無法繼承私有屬性。