棧是一種遵從後進先出(LIFO)原則的有序集合。新添加的或待刪除的元素都保存在棧末尾,稱作棧頂,另一端稱作棧底。在棧裡,新元素都靠近棧頂,舊元素就接近棧底。
棧是一種高效的數據結構,因為數據只能在棧頂添加或刪除,所以這樣的操作很快,而且容易實現。
棧是一種特殊的列表,棧內的元素只能通過列表的一端訪問,這一端稱為棧頂。棧被稱為一種後入先出(LIFO,last-in-first-out)的數據結構。由於棧具有後入先出的特點,所以任何不在棧頂的元素都無法訪問。為了得到棧底的元 素,必須先拿掉上面的元素。
棧的實現
用數組 dataStore 保存棧內元素,構造函數將其初始化為一個空數組。變量 top 記錄 棧頂位置,被構造函數初始化為 0,表示棧頂對應數組的起始位置 0。如果有元素被壓入 棧,該變量的值將隨之變化。
function Stack() {
this.dataStore = [];
this.top = 0;
this.push = push;
this.pop = pop;
this.peek = peek;
}
push() 方法:當向棧中壓入一個新元素時,需要將其保存在數組中變量 top 所對應的位置,然後將 top 值加 1,讓其指向數組中下一個空位置。
function push(element) {
this.dataStore[this.top++] = element;
}
pop() 方法:與 push() 方法相反——它返回棧頂元素,同時將變量 top 的值減 1
function pop() {
return this.dataStore[--this.top];
}
peek() 方法:返回數組的第 top-1 個位置的元素,即棧頂元素。如果對一個空棧調用 peek() 方法,結果為 undefined。這是因為棧是空的,棧頂沒有任何 元素。
pop() 方法雖然可以訪問棧頂的元素,但是調用該方法後,棧頂元素也從棧中被永久性地刪除了。peek() 方法則只返回棧頂元素,而不刪除它。
function peek() {
return this.dataStore[this.top-1];
}
length() 方法:通過返回變量 top 值的方式返回棧 內的元素個數
function length() {
return this.top;
}
clear()方法:將變量 top 的值設為 0,清空棧
function clear() {
this.top = 0;
}
使用棧解決問題舉例:判斷一個字符串是否是迴文
閱讀更多 劉弋 的文章