javascript數據結構與算法筆記(三):優先隊列
一:簡介
優先隊列是元素的添加和移除是基於優先級的。一個現實的例子就是機場登機的順序。頭等艙和商務艙乘客的優先級要高於經濟艙乘客。在有些國家,老年人和孕婦(或帶小孩的婦女)登機時也享有高於其他乘客的優先級。
二:ES6版PriorityQueue類
1.使用WeakMap類聲明PriorityQueue類
具體原因可以參照:https://blog.csdn.net/wushichao0325/article/details/84969725
let PriorityQueue=(function(){
const items=new WeakMap();
class PriorityQueue{
constructor(){
items.set(this,[]);
}
QueueElement(element,priority){
let queueElement={
element:element,
priority:priority
}
return queueElement;
}
}
return PriorityQueue;
})();
2.向優先隊列添加元素
enqueue(element,priority){
let queueElement=this.QueueElement(element,priority);
let added=false;
let q=items.get(this);
for(let i=0;i<q.length;i++){
if(queueElement.priority<q[i].priority){//新元素的等級比源裏面的高
q.splice(i,0,queueElement);//插入元素
added=true;
break;
}
}
if(!added){//如果新元素都比源的優先級低,只需直接push
q.push(queueElement);
}
}
3.從優先隊列移除元素
dequeue(){
let q=items.get(this);
let r=q.shift();
return r;
}
4.查看優先隊列頭元素
front(){//查看優先隊列頭元素
let q=items.get(this);
return q[0];
}
5.檢查優先隊列是否爲空
isEmpty,如果優先隊列爲空的話將返回true,否則就返回false:
isEmpty(){
let q=items.get(this);
return q.length==0;
}
size(){
let q=items.get(this);
return q.length;
}
6.打印優先隊列元素
print(){
let q=items.get(this);
for(let i=0;i<q.length;i++){
console.log(`內容:${q[i].element}-優先級:${q[i].priority}`);
}
}
7.使用優先隊列
let priorityQueue = new PriorityQueue();
priorityQueue.enqueue("John", 3);
priorityQueue.enqueue("Jack", 1);
priorityQueue.enqueue("Camila", 2);
priorityQueue.print();