队列
什么是队列
队列是一种列表,不同的是队列只能在队尾插入元素,在队首删除元素。队列用于存储按顺序排列的数据,先进先出,这点和栈不一样,在栈中,
最后入栈的元素反而被优先处理。可以将队列想象成在银行前排队的人群,排在最前面的人第一个办理业务,新来的人只能在后面排队,直到轮到
他们为止。队列是一种先进先出(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)的行为特征
class PriorityQueue<T>{ private items:Array<{element:T,priority:number}> = []; //向队列添加元素 public enqueue(data:{element:T,priority:number}):void{ let isAdd:boolean = false; for(let i: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); } } //从队列移除元素 public dequeue():{element:T,priority:number}{ return this.items.shift(); } //返回队列的第一个元素 public front():{element:T,priority:number}{ 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{ this.items.forEach(function (item) { console.log(`${item.element} - ${item.priority}`); }); } } let priorityQueue:PriorityQueue<string> = new PriorityQueue<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