javascript資料結構——棧
阿新 • • 發佈:2020-07-26
棧是一種高效的資料結構,資料只能在棧頂新增或刪除,所以這樣操作很快,也很容易實現。棧的使用遍佈程式語言實現的方方面面,從表示式求值到處理函式呼叫。接下來,用JavaScript實現一個棧的資料結構。
定義棧的操作
棧作為一種特殊的列表,只能從一端來進行訪問,就像一摞盤子,放只能放在上面,拿也只能從上面拿,所以棧是一種先入後出的一種資料結構。因為棧的這種特點,棧中任意不在棧頂的元素都無法訪問,為了得到棧底的元素,必須把該元素之上的元素拿掉,把棧底的元素暴露在棧頂。棧還可以清空其內所有元素,也可以記錄棧內元素的個數。
綜上,我們定義幾個操作棧的方法。
- push() 把元素新增到棧頂
- pop() 把元素從棧頂刪除
- peek() 返回棧頂的元素
- clear() 清空棧內元素
- length() 棧內元素的個數
棧的實現
實現棧,底層的資料結構採用陣列,以定義棧的建構函式開始;
function Stack() { this.dataStore = []; //用來儲存棧內元素的陣列 this.top = 0; //top用來記錄棧頂位置,初始化為0 this.push = push; this.pop = pop; this.peek = peek; this.clear = clear;this.length = length; }
接下來實現push(),pop(),peek(),clear()和length()。
- push()方法是,當向棧頂新增一個新元素時,在陣列的記錄棧頂的位置的top的位置新增這個值,新增完成top需要加1;
- pop()正好與push()相反,需要top減1,但同時減1之後返回top位置的值,即已刪除元素;
- peek()直接返回陣列top-1位置的元素,即棧頂元素就可以了;
- clear() 直接把top值賦為0,直接清空棧;
- length()直接返回top的值,棧頂位置即棧內元素個數
看程式碼……
functionpush(element) { this.dataStore[this.top++] = element; // 先在top位置加入元素,之後top加1 } function pop() { return this.dataStore[--this.top]; // top先減1,然後返回top位置的元素 } function peek() { return this.dataStore[this.top - 1]; } function clear() { this.top = 0; } function length() { return this.top; }
棧的測試
測試一下剛剛定義的棧。
const s = new Stack(); s.push('hello'); s.push('world'); s.push('javascript'); console.log(`棧內元素個數:${s.length()}`); console.log(`棧頂元素為:${s.peek()}`); let popped = s.pop(); console.log(`刪掉的元素是:${popped}`); console.log(`現在的棧頂元素是:${s.peek()}`); s.push('vue'); console.log(`push後的棧頂元素:${s.peek()}`); s.clear(); console.log(`清空後的長度:${s.length()}`); s.push('react'); console.log(s.peek());
藉助node命令列,檢視以上程式碼執行結果。
正是預期的結果。
棧的應用
下面把棧這種資料結構應用起來解決一些問題。有一些問題特別適合用棧來解決。比如進位制轉化。
可以利用棧將一個數字從一種數制轉化成另一種數制,例如數字n轉換為以b(b為2~9)進位制數。轉換演算法如下。
-
最高位為 n % b,將此位壓入棧。
-
使用 n/b 代替 n。
-
重複步驟 1 和 2,直到 n 等於 0,且沒有餘數。
-
持續將棧內元素彈出,直到棧為空,依次將這些元素排列,就得到轉換後數字的字串形式。
下面程式碼實現該演算法。
function mulBase(num, base) { var s = new Stack(); do { s.push(num % base); num = Math.floor(num /= base); } while (num > 0); var converted = ""; while (s.length() > 0) { converted += s.pop(); } return converted; } let num1 = mulBase(125, 5); let num2 = mulBase(87, 2); console.log(`125轉成5進位制:${num1}`); console.log(`87轉成2進位制:${num2}`);
輸出結果為
棧是一種比較簡單的資料結構,關於棧的內容就寫這麼多吧!