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