lickylin 2019-06-30
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 })();