1. 程式人生 > >javascript資料結構與演算法筆記(三):優先佇列

javascript資料結構與演算法筆記(三):優先佇列

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();