- 行列遵照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
})();