1. 程式人生 > 實用技巧 >資料結構-佇列<Typescript>

資料結構-佇列<Typescript>

佇列

什麼是佇列

佇列是一種列表,不同的是佇列只能在隊尾插入元素,在隊首刪除元素。佇列用於儲存按順序排列的資料,先進先出,這點和棧不一樣,在棧中,
最後入棧的元素反而被優先處理。可以將佇列想象成在銀行前排隊的人群,排在最前面的人第一個辦理業務,新來的人只能在後面排隊,直到輪到
他們為止。佇列是一種先進先出(First-In-First-Out,FIFO)的資料結構。

佇列的實現

佇列的兩種主要操作是:向佇列中插入新元素和刪除佇列中的元素。插入操作也叫做入隊enqueue(),刪除操作也叫做出隊dequeue()。入隊操作在隊尾插入新元素,
出隊操作刪除隊頭的元素。佇列的另外一項重要操作是讀取隊頭的元素。這個操作叫做 front()。該操作返回隊頭元素,但不把它從佇列中刪除。
除了讀取隊頭元素,我們還想知道佇列中儲存了多少元素,可以使用 size()滿足該需求;要想清空佇列中的所有元素,可以使用 clear() 方法來實
現,isEmpty()方法來判斷佇列是否為空。

class Queue<T>{
    private items:Array<T> = [];
    //向佇列新增元素
    public enqueue(element:T):void{
        this.items.push(element);
    }
    //從佇列移除元素
    public dequeue():T{
        return this.items.shift();
    }
    //返回佇列的第一個元素
    public front():T{
        return this.items[0];
    }
    
//判斷佇列是否為空 public isEmpty():boolean{ return this.items.length == 0; } //返回佇列長度 public size():number{ return this.items.length; } //清空佇列 public clear():void{ this.items = []; } //列印佇列元素 public print():void{ console.log("佇列元素:",this.items.toString() + "--佇列元素數量",this
.items.length); } } let q:Queue<string> = new Queue<string>(); q.enqueue("射鵰英雄傳"); q.enqueue("神鵰俠侶"); q.enqueue("倚天屠龍記"); q.print();//佇列元素: 射鵰英雄傳,神鵰俠侶,倚天屠龍記--佇列元素數量 3 q.dequeue(); q.print();//佇列元素: 神鵰俠侶,倚天屠龍記--佇列元素數量 2 q.clear();
q.print();//佇列元素: --佇列元素數量 0

優先佇列

普通的佇列是一種先進先出的資料結構,元素在佇列尾追加,而從佇列頭刪除。在優先佇列中,元素被賦予優先順序。當訪問元素時,具有最高優先順序的元素最先刪除。優先佇列具有最高階先出 (first in, largest out)的行為特徵

classPriorityQueue<T>{
privateitems:Array<{element:T,priority:number}>=[];
//向佇列新增元素
publicenqueue(data:{element:T,priority:number}):void{
letisAdd:boolean=false;
for(leti:number=0;i<this.items.length;i++){
if(data.priority<this.items[i].priority){
this.items.splice(i,0,data);
isAdd=true;
break;
}
}
if(!isAdd){
this.items.push(data);
}
}
//從佇列移除元素
publicdequeue():{element:T,priority:number}{
returnthis.items.shift();
}
//返回佇列的第一個元素
publicfront():{element:T,priority:number}{
returnthis.items[0];
}
//判斷佇列是否為空
publicisEmpty():boolean{
returnthis.items.length==0;
}
//返回佇列長度
publicsize():number{
returnthis.items.length;
}
//清空佇列
publicclear():void{
this.items=[];
}
//列印佇列元素
publicprint():void{
this.items.forEach(function(item){
console.log(`${item.element}-${item.priority}`);
});
}
}
letpriorityQueue:PriorityQueue<string>=newPriorityQueue<string>();
priorityQueue.enqueue({element:"yoyo",priority:1});
priorityQueue.enqueue({element:"gigi",priority:15});
priorityQueue.enqueue({element:"vivi",priority:12});
priorityQueue.enqueue({element:"kiki",priority:12});
priorityQueue.print();
// yoyo - 1 
// vivi-12 
// kiki - 12 
// gigi-15