队列遵循 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
})();