javascript数据结构 队列结构(Queue)


JavaScript实现队列结构(Queue)

  • 队列是一种受限的线性表,特点为先进先出(FIFO:first in first out)
    图片

  • 在表的末尾进行添加 再表的前端进行删除

  • 队列和栈一样 有两种方式实现,本章介绍使用数组实现的队列

    队列的常见操作:

  • enqueue(element):向队列尾部添加一个(或多个)新的项;

  • dequeue():移除队列的第一(即排在队列最前面的)项,并返回被移除的元素;

  • front():返回队列中的第一个元素——最先被添加,也将是最先被移除的元素。队列不做任何变动(不移除元素,只返回元素信息与Stack类的peek方法非常类似);

  • isEmpty():如果队列中不包含任何元素,返回true,否则返回false;

  • size():返回队列包含的元素个数,与数组的length属性类似;

  • toString():将队列中的内容,转成字符串形式;

#封装队列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// 封装一个队列
function queue(){
// 属性
this.items=[];
// 方法
// 队列中添加一个元素
queue.prototype.enqueue=function(element){
this.items.push(element)
}
// 队列中移除一个元素
queue.prototype.dequeue=function(){
return this.items.shift()
}
// 查看队列前端的元素
queue.prototype.front=function(){
return this.items[0]
}
// 查看队列长度
queue.prototype.size=function(){
return this.items.length
}
// 检查队列是否为空
queue.prototype.isEmpty=function(){
return this.items[this.items.length]==0
}
// 队列的toString方法
queue.prototype.toString=function(){
var resstring='';
for(var i=0;i<this.items.length;i++){
resstring+=this.items[i]+' ';
}
return resstring;
}

使用队列实现击鼓传花

  • 使用队列实现小游戏:击鼓传花,传入一组数据和设定的数字num,循环遍历数组内元素,遍历到的元素为指定数字num时将该元素删除,直至数组剩下一个元素。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// 击鼓传花

var passgame=function(namelist,num){
// 1.调用队列
var queue1=new queue()

// 2.将名字加入到队列中
for(i=0;i<namelist.length;i++){
queue1.enqueue(namelist[i])
}
// 3.开始数数字

while (queue1.size()>1) {
for(i=0;i<num-1;i++){
queue1.enqueue(queue1.dequeue())
}
queue1.dequeue();

}
alert(queue1.size())
return queue1.front()



}
// 测试程序
names=['dwdw','dth','zad','wwf','jtg']
alert(passgame(names,3))

优先级队列

  • 优先级队列主要考虑的问题为:
    • 每个元素不再只是一个数据,还包含数据的优先级;
    • 在添加数据过程中,根据优先级放入到正确位置;
    • 优先级队列在封装方法时 特别要考虑的就是插入方法 其他方法的实现与普通队列并无区别

优先级队列的封装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
function Prorioqueue(){
// 在prioriqueue内部重新创建了一个类 可以理解为内部类
function Queueelement(element,prorio){
this.element=element;
this.prorio=prorio;
}
//封装属性
this.items=[];

// 封装方法

Prorioqueue.prototype.enqueue=function(element,prorio){

var queueelement=new Queueelement(element,prorio)

if(this.items==0){
this.items.push(queueelement)


}else{
var add=false;
for(i=0;i<this.items.length;i++){
if (queueelement.prorio<this.items[i].prorio) {
this.items.splice(i,0,queueelement)
add=true;
break;

}
}
}
if(!add){
this.items.push(queueelement)
}



}
// 队列中移除一个元素
Prorioqueue.prototype.dequeue=function(){
return this.items.shift()
}
// 查看队列前端的元素
Prorioqueue.prototype.front=function(){
return this.items[0]
}
// 查看队列长度
Prorioqueue.prototype.size=function(){
return this.items.length
}
// 检查队列是否为空
Prorioqueue.prototype.isEmpty=function(){
return this.items[this.items.length]==0
}
// 队列的toString方法
Prorioqueue.prototype.toString=function(){
var resstring='';
for(var i=0;i<this.items.length;i++){
resstring+=this.items[i].element+'-'+this.items[i].prorio;
}
return resstring;
}





}

文章作者: 贾志飞
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 贾志飞 !
评论
  目录