JavaScript資料結構之-棧

collins是個愛哭的鼻涕蟲發表於2019-04-30

棧資料結構

是一種遵循 後進先出(LIFO) 原則的有序集合。新新增和待刪除的資料都儲存在棧的同一端棧頂,另一端就是棧底。新元素靠近棧頂,舊元素靠近棧底。

JavaScript資料結構之-棧

建立一個棧

我們需要自己建立一個棧,並且這個棧包含一些方法。

  • push(element(s)):新增一個(或多個)新元素到棧頂
  • pop():刪除棧頂的元素,並返回該元素
  • peek():返回棧頂的元素,不對棧做任何操作
  • isEmpty():檢查棧是否為空
  • size():返回棧的元素個數
  • clear():清空棧
function Stack() {
    let items = [];
    this.push = function(element) {
        items.push(element);
    };
    this.pop = function() {
        let s = items.pop();
        return s;
    };
    this.peek =  function() {
        return items[items.length - 1];
    };
    this.isEmpty = function() {
        return items.length == 0;  
    };
    this.size = function() {
        return items.length;
    };
    this.clear = function() {
        items = [];
    }
}
複製程式碼

但是這樣的方式在建立多個例項的時候為建立多個items的副本。就不太合適了。 用ES如何6實現Stack類了。可以用WeakMap實現,並保證屬性是私有的。

let Stack = (function() {
        const items = new WeakMap();
        class Stack {
            constructor() {
                items.set(this, []);
            }
            getItems() {
                let s = items.get(this);
                return s;
            }
            push(element) {
                this.getItems().push(element);
            }
            pop() {
                return this.getItems().pop();
            }
            peek() {
                return this.getItems()[this.getItems.length - 1];
            }
            isEmpty() {
                return this.getItems().length == 0;
            }
            size() {
                return this.getItems().length;
            }
            clear() {
                this.getItems() = [];
            }
        }
        return Stack;
})();
複製程式碼

用棧解決問題

棧可以解決十進位制轉為二進位制的問題、任意進位制轉換的問題、平衡園括號問題、漢羅塔問題。

// 例子十進位制轉二進位制問題
function divideBy2(decNumber) {
    var remStack = new Stack(),
        rem,
        binaryString = '';
    while (decNumber > 0) {
        rem = Math.floor(decNumber % 2);
        remStack.push(rem);
        decNumber = Math.floor(decNumber / 2);
    }
    while(!remStack.isEmpty()) {
        binaryString += remStack.pop().toString();
    }
    return binaryString;
}
// 任意進位制轉換的演算法
function baseConverter(decNumber, base) {
    var remStack = new Stack(),
        rem,
        binaryString = '',
        digits = '0123456789ABCDEF';
    while (decNumber > 0) {
        rem = Math.floor(decNumber % base);
        remStack.push(rem);
        decNumber = Math.floor(decNumber / base);
    }
    while(!remStack.isEmpty()) {
        binaryString += digits[remStack.pop()].toString();
    }
    return binaryString;
}
複製程式碼

相關文章