您的位置:首页 > 理论基础 > 数据结构算法

js数据结构——队列

2017-01-22 00:00 176 查看
摘要: js数据结构——队列

一、

1.创建队列

function Queue(){
var items = [];
if(typeof this.enqueue != "function"){
//进队
Queue.prototype.enqueue = function(element){
items.push(element);
};
//出队
Queue.prototype.dequeue = function(){
return items.shift();
};
//返回队列中的第一个元素
Queue.prototype.front = function(){
return items[0];
};
//判断是否空队
Queue.prototype.isEmpty = function(){
return items.length == 0;
};
//清空队列
Queue.prototype.clear = function(){
items = [];
};
//返回队列大小
Queue.prototype.size = function(){
return items.length;
};
//打印
Queue.prototype.print = function(){
console.log(items.toString());
};
}
}


(1)上面代码利用数组和数组的push()和shift()方法实现进队和出队

2.使用队列

var queue = new Queue();
//入队并打印
queue.enqueue(5);
queue.enqueue(1);
queue.enqueue(8);
queue.enqueue(2);
queue.enqueue(4);
queue.print();              //5,1,8,2,4
//返回第一个元素并打印
console.log(queue.front()); //5
queue.print();              //5,1,8,2,4
//出队一个元素并打印,输出大小
queue.dequeue();
queue.print();              //1,8,2,4
console.log(queue.size());  //4
//清空队列并判空
queue.clear();
console.log(queue.isEmpty());//true

二、优先队列

1.创建优先队列

所谓优先队列,就是在元素添加和删除的时候是基于优先级的。

1.创建一个元素对象,有两个属性,元素值和元素优先级

2.入队,首先想到,最开始是空队,if(this.empty()),直接入队

3.如果不是空队,先设置找到插入位标记(flag = false),然后遍历已有队列中的元素,比较优先级大小,优先级数值小的(及优先级大的在前)

4.判断条件,如果元素的优先级数值大于队列中元素的优先级数值,进入下一次循环。

5。如果满足元素的优先级数值小于队列中元素的优先级数值,flag置为true,表示已经找到插入位,并用splice方法添加元素.

6.如果flag还是为flase,说明队列中所有元素的优先级数值都比要插入的数值小,所以直接入队就可以了

function PriorityQueue(){
var items = [];
function QueueElement(element,priority){
this.element = element;
this.priority = priority;
}
if(typeof this.enqueue != "function"){
//进队
PriorityQueue.prototype.enqueue = function(element,priority){
var queueElement = new QueueElement(element,priority);
if(this.isEmpty()){
items.push(queueElement);
}else{
var flag = false;
for(var i = 0;i < items.length;i++){
if(queueElement.priority < items[i].priority){
flag = true;
items.splice(i,0,queueElement);
break;
}
}
if(!flag){
items.push(queueElement)
}
}
};
//出队
PriorityQueue.prototype.dequeue = function(){
return items.shift();
};
//返回队列中的第一个元素
PriorityQueue.prototype.front = function(){
return "->"+items[0].element+","+items[0].priority;
};
//判断是否空队
PriorityQueue.prototype.isEmpty = function(){
return items.length == 0;
};
//清空队列
PriorityQueue.prototype.clear = function(){
items = [];
};
//返回队列大小
PriorityQueue.prototype.size = function(){
return items.length;
};
//重写toString方法
PriorityQueue.prototype.toString = function(){

}
//打印
PriorityQueue.prototype.print = function(){
for(var i = 0;i < items.length;i++){
console.log("("+items[i].element+","+items[i].priority+")");
}
};
}
}


(1)每次入队的是一个对象,根据priority属性排序,根据element属性取值。

2.使用优先队列

var queue = new PriorityQueue();
//入队并打印
queue.enqueue(5,1);
queue.enqueue(1,1);
queue.enqueue(8,3);
queue.enqueue(2,5);
queue.enqueue(4,6);
queue.print();              //(5,1),(1,1),(8,3),(2,5),(4,6)
//返回第一个元素并打印
console.log(queue.front()); //->5,1
queue.print();              //(5,1),(1,1),(8,3),(2,5),(4,6)
//出队一个元素并打印,输出大小
queue.dequeue();
queue.print();              //(1,1),(8,3),(2,5),(4,6)
console.log(queue.size());  //4
//清空队列并判空
queue.clear();
console.log(queue.isEmpty());//true


(2)值得注意的是,每一次进队一个元素时,前面的总是已经排好序的……。

三、循环队列

通过将将出队元素进队实现循环队列

所以,循环队列可以基于普通队列实现

例:击鼓传花游戏

function whoWin(nameList,num){
var queue = new Queue();
//初始化队列
for(var i = 0;i < nameList.length;i++){
queue.enqueue(nameList[i])
}
//当队列的大小大于1的时候重复num次,把队首元素放到队尾,然后出队队首元素
var pass = '';
while(queue.size() > 1){
for(var i = 0;i < num;i++) {
queue.enqueue(queue.dequeue());
}
pass = queue.dequeue();
console.log(pass+"在击鼓传花游戏中被淘汰");
}
return queue.front();
}
var names = ['wjj','wjw','wjy','wyc','wak','wp'];
var winner = whoWin(names,7);
console.log("胜利者:"+winner);


(1)上述代码要有“一”中的普通队列代码位基础

(2)如果直接在数组中遍历,很难获取他应该删除的位置,利用队列,每执行一次把元素放到队首,删除时,直接删除队首元素即可。

(3)两个循环条件,一个是queue.size()>0,保证剩余一个元素,另一个i<num,表示设定的循环次数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: