《JavaScript數據結構與算法》筆記——第3章 棧

  • 棧是一種後進先出(LIFO)的有序集合
  • 函數建立棧
function Stack() {
    // 各類屬性和方法的聲明
    item = [];// 須要一種數據結構來保存棧裏的元素
    // 爲棧聲明一些方法
    /**
     * 添加一個或者幾個新元素到棧頂
     * @param element
     */
    this.push = function (element) {
        item.push(element)
    };
    /**
     * 移出棧頂的元素,同時返回被移出的元素
     * @returns {*}
     */
    this.pop = function () {
        return item.pop()
    };
    /**
     * 返回棧頂的元素,不對棧作任何修改
     * @returns {*}
     */
    this.peek = function () {
        return item[item.length - 1]
    };
    /**
     * 若是棧裏沒有任何元素就返回true,不然返回false
     * @returns {boolean}
     */
    this.isEmpty = function () {
        return item.length === 0
    };
    /**
     * 移出棧裏的全部元素
     */
    this.clear = function () {
        item = []
    };
    /**
     * 返回棧裏的元素個數
     * @returns {Array|number}
     */
    this.size = function () {
        return item.length
    }
}
  • ES6語法聲明
class Stack {
    constructor() {
        this.items = [];
    }
    push(element) {
        this.items.push(element)
    }
    // 其餘方法
}
/**
 * 因爲根據原型實現,沒法建立私有屬性
 */
/**
 * 改進1
 * 使用ES6新增類型Symbol,基本類型,一般不可改變
 *
 * ES6中Object.getOwnPropertySymbol()方法可以獲取到類裏面聲明的全部Symbol屬性,經過這個能夠操做其餘數組方法
 */
let _items = Symbol();
class Stack {
    constructor() {
        this[_items] = [];
    }
    // Stack方法
    push(element) {
        this[_items].push(element)
    }
}
let demo = new Stack();
let objSymbols = Object.getOwnPropertySymbols(demo);
demo[objSymbols[0]].pop();// 能夠訪問未暴露的數組方法
/**
 * 改進2
 * 使用WeakMap實現類(ES6新的集合類型,存儲鍵值對,避開對數組方法的直接訪問)
 */
let Stack = (function () {// 閉包使得外部沒法訪問WeekMap,達到私有目的,而且不會暴露其餘未暴露的數組方法
    const items = new WeakMap();
    class InnerStack {
        constructor() {
            items.set(this, [])
        }
        push(element) {
            items.get(this).push(element)
        }
        pop() {
            return items.get(this).pop()
        }
        print() {
            return items.get(this).toString()
        }
    }
    return InnerStack
})();
// 改進2 的方法使得子類沒法繼承私有屬性
  • 棧的應用:十進制轉二進制
相關文章
相關標籤/搜索