回顾知识,才能继续深入!
队列也是一种重要的数据结构,看起来比较简单,这里做个笔记,方便自己之后回顾~
- 队列的特点:先进先出
- 实例:生活中排队的例子
- 实现方法:
1)创建队列
function Queue(){
let items=[];//存放元素
}
2)队列的方法:
增:enqueue(element(s)),向队列尾部添加一个或多个元素
删:dequeue(),移除队列的第一个元素,并返回被移除的值
查:front(),返回第一个元素
isEmpty(),查看队列是否为空
size(),返回队列包含的元素个数
3)具体实现方法:
enqueue(element(s)),向队列中添加元素
this.enqueue=function(element){
items.push(element);//添加元素
}
dequeue(),向队列中移除元素
this.dequeue=function(){
return items.shift();//移除第一个元素
}
front(),查看队列头元素
this.front=function(){
return items[0];//查看第一个元素
}
isEmpty(),查看队列是否为空
this.isEmpty=function(){
return items.length==0;
}
size(),查看队列的元素个数
this.size=function(){
return items.length;
}
打印队列元素
this.print=function(){
console.log(items.toString());
}
完整代码和测试:
function Queue(){
let items=[];
this.enqueue=function(element){
items.push(element);
};
this.dequeue=function(){
return items.shift();
};
this.front=function(){
return items[0];
};
this.isEmpty=function(){
return items.length==0;
};
this.size=function(){
return items.length;
};
this.print=function(){
console.log(items.toString());
}
}
let queue=new Queue();
console.log(queue.isEmpty());
queue.enqueue("John");
queue.enqueue("Jack");
queue.print();
console.log(queue.size());
console.log(queue.isEmpty());
queue.dequeue();
queue.print();
4)队列的修改
- 优先队列
通过设置优先级:
function PriorityQueue(){
let items=[];
function QueueElement(element,priority){
this.element=element;
this.priority=priority;
}
this.enqueue=function(element,priority){
let queueElement=new QueueElement(element,priority);
//注意这added的控制
let added=false;
for(let i=0;i<items.length;i++){
//如果新入队的优先级较高,则插入到比它低的前面
if(queueElement.priority<items[i].priority){
items.splice(i,0,queueElement);;
added=true;
break;
}
}
if(!added){ //如果优先级没有高于其他元素,则直接插入队尾
items.push(queueElement);
}
};
this.print=function(){
for(let i=0;i<items.length;i++){
console.log(`${items[i].element}-${items[i].priority}`);
}
};
this.dequeue=function(){
return items.shift();
};
this.front=function(){
return items[0];
};
this.isEmpty=function(){
return items.length==0;
};
this.size=function(){
return items.length;
};
}
let priorityQueue=new PriorityQueue();
priorityQueue.enqueue("John",2);
priorityQueue.enqueue("Jack",1);
priorityQueue.enqueue("Camila",1);
priorityQueue.print();
- 循环队列
例子:击鼓传花
function hotPotato(nameList,num){
let queue=new Queue();
for(let i=0;i<nameList.length;i++){
queue.enqueue(nameList[i]);//全部人入列
}
let eliminated='';
while(queue.size()>1){
for(let i=0;i<num;i++){
queue.enqueue(queue.dequeue());//击鼓传花的实现,就是将队列的头移到队列的尾,直到size=1
}
eliminated=queue.dequeue();
console.log(eliminated+'在击鼓传花游戏中被淘汰');
}
return queue.dequeue();
}
let names=['John','Jack','Camila','Ingrid','Carl'];
let winner=hotPotato(names,7);
console.log('The winner is '+winner);
以上例子均来自《学习javascript数据结构与算法》书籍
真的很佩服本书的作者!!!