《JavaScript資料結構與演算法》筆記——第4章 佇列

王遠東發表於2019-02-16
  • 佇列遵循FIFO(First In First Out)原則的一組有序的項
let Queue = (function () {
    let item = new WeakMap();
    class InnerQueue {
        constructor() {
            item.set(this, [])
        }
        /**
         * 向佇列尾部新增一個項
         * @param element
         */
        enqueue(element) {
            item.get(this).push(element)
        }
        /**
         * 移除佇列的第一項
         */
        dequeue() {
            return item.get(this).shift()
        }
        /**
         * 返回佇列中第一項,對佇列本身不做修改
         * @returns {*}
         */
        front() {
            return item.get(this)[0]
        }
        /**
         * 判斷佇列是否為空
         * @returns {boolean}
         */
        isEmpty() {
            return item.get(this).length === 0
        }
        /**
         * 返回佇列包含的元素個數
         * @returns {*}
         */
        size() {
            return item.get(this).length
        }
    }
    return InnerQueue
})();
  • 優先佇列
let PriorityQueue = (function () {
    let item = new WeakMap();
    class InnerQueue {
        constructor() {
            item.set(this, [])
        }
        /**
         * 根據優先順序新增項(最小優先佇列)
         * @param element
         * @param priority
         */
        enqueue(element, priority = (item.get(this).length === 0 ? 1 : item.get(this)[item.get(this).length - 1].priority + 1)) {
            const queue = item.get(this);
            if (queue.length === 0) {
                item.get(this).push({element, priority});
                return;
            }
            for (let i = 0; i < queue.length; i++) {
                if (priority < queue[i].priority) {
                    item.get(this).splice(i, 0, {element, priority});
                    break;
                } else if (i === queue.length - 1) {
                    item.get(this).push({element, priority});
                    break;
                }
            }
        }
        /**
         * 移除佇列的第一項
         */
        dequeue() {
            return item.get(this).shift()
        }
        /**
         * 返回佇列中第一項,對佇列本身不做修改
         * @returns {*}
         */
        front() {
            return item.get(this)[0]
        }
        /**
         * 判斷佇列是否為空
         * @returns {boolean}
         */
        isEmpty() {
            return item.get(this).length === 0
        }
        /**
         * 返回佇列包含的元素個數
         * @returns {*}
         */
        size() {
            return item.get(this).length
        }
        print() {
            return JSON.stringify(item.get(this))
        }
    }
    return InnerQueue
})();

相關文章