資料結構-佇列<Typescript>
阿新 • • 發佈:2020-12-27
佇列
什麼是佇列
佇列是一種列表,不同的是佇列只能在隊尾插入元素,在隊首刪除元素。佇列用於儲存按順序排列的資料,先進先出,這點和棧不一樣,在棧中,
最後入棧的元素反而被優先處理。可以將佇列想象成在銀行前排隊的人群,排在最前面的人第一個辦理業務,新來的人只能在後面排隊,直到輪到
他們為止。佇列是一種先進先出(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