- 源碼地址請點擊此處
棧是線性表的一種衍生結(jié)構(gòu),是一種操作受限的線性表衔憨。在使用普通的線性表時,可以在任意位置進行操作袄膏,比如插入元素践图、刪除元素、查找元素等沉馆。而棧只能在一端進行操作码党,并且不具備插入和查找的功能。
棧的基本結(jié)構(gòu)
棧的基本結(jié)構(gòu)如下所示:
棧是一種先進后出(FILO斥黑,F(xiàn)irst In Last Out)的數(shù)據(jù)結(jié)構(gòu)揖盘,因此,如果將元素添加到棧中的順序為 a1锌奴,a2兽狭,...,an缨叫,那么將元素從棧中移除的順序就是 an椭符,...,a2耻姥,a1销钝。
棧有以下幾個基本概念:
- 入棧
將元素添加到棧中,也稱為進棧琐簇、壓棧蒸健。 - 出棧
將元素從棧中移除座享,也成為退棧、彈棧似忧。 - 棧頂
入棧和出棧只能在棧的一端進行渣叛,叫做棧頂。 - 棧底
相對于棧頂盯捌,棧的另外一端被稱為棧底淳衙。
棧的代碼實現(xiàn)
下面是棧的代碼實現(xiàn),在 JavaScript 中實現(xiàn)棧數(shù)據(jù)結(jié)構(gòu)需要借助數(shù)組饺著,其中進棧和出棧操作需要分別借助于數(shù)組的 push()
方法和 pop()
方法箫攀。
接口定義
interface IStack<T>{
// 獲取棧的長度
size():number;
// 壓棧操作
push(ele:T):T;
// 出棧操作
pop():T;
// 獲取棧頂?shù)脑? peek():T;
// 清除棧中的元素
clear():void;
// 判斷棧是否為空
isEmpety():boolean;
// 獲取棧中的元素信息
toString():T[];
}
接口實現(xiàn)
class Stack<T> implements IStack<T>{
private _size:number = 0;
private dataStore:T[] = [];
size():number{
// 獲取棧的長度
return this._size;
}
push(ele:T):T{
// 向棧中插入元素,借助數(shù)組的 push 方法
this.dataStore.push(ele);
this._size++;
return ele;
}
pop():T{
// 從棧中移除元素幼衰,借助數(shù)組的 pop 方法
const ele = this.dataStore.pop();
this._size--;
return ele;
}
peek():T{
// 獲取棧頂?shù)脑? const index = this._size ? (this._size - 1) : this._size;
return this.dataStore[index];
}
clear():void{
// 清除棧中的元素
this.dataStore = [];
this._size = 0;
}
isEmpety():boolean{
// 判斷棧是否為空
return !this._size;
}
toString():T[]{
// 返回棧中的元素信息
return this.dataStore;
}
}
可見靴跛,棧的實現(xiàn)比普通線性表(List)要簡單許多,使用 JavaScript 實現(xiàn)棧還是比較容易的渡嚣。
完梢睛。