1. 程式人生 > 實用技巧 >javascript資料結構——棧

javascript資料結構——棧

  棧是一種高效的資料結構,資料只能在棧頂新增或刪除,所以這樣操作很快,也很容易實現。棧的使用遍佈程式語言實現的方方面面,從表示式求值到處理函式呼叫。接下來,用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的值,棧頂位置即棧內元素個數

  看程式碼……

function
push(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)進位制數。轉換演算法如下。

  1. 最高位為 n % b,將此位壓入棧。

  2. 使用 n/b 代替 n。

  3. 重複步驟 1 和 2,直到 n 等於 0,且沒有餘數。

  4. 持續將棧內元素彈出,直到棧為空,依次將這些元素排列,就得到轉換後數字的字串形式。

  下面程式碼實現該演算法。

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}`);

輸出結果為

棧是一種比較簡單的資料結構,關於棧的內容就寫這麼多吧!