Queue---队列
队列和栈非常相似,只是使用了不同的原则,它遵循先进先出原则的一组有序的项,而非后进先出原则;队列在尾部添加新元素,在顶部移除元素;
创建一个类模拟
function Queue(){
var list=[];
}
//Queue类和Stack类非常相似;
1
2
3
4
2
3
4
给Queue类定义一些方法;
- enqueue(element) 向队列添加新的元素;
- dequeue() 移除队列中顶部元素,并返回移除的元素;
- front() 返回队列中顶部元素,也是即将要被移除的元素;
- isEmpty() 返回true,代表队列中还有数据,返回false,则代表没有数据;
- size() 返回队列中的元素个数;
根据上面的要求,实现类
function Queue(){
var list=[];
//enqueue 向队列添加新的元素;
this.enqueue=function(element){
list.push(element);
}
//dequeue 移除队列中顶部元素,并返回移除的元素;
this.dequeue=function(){
return list.shift();
}
//front 返回顶部元素
this.front=function(){
return list[0];
}
//isEmpty 确定队列是否还有元素
this.isEmpty=function(){
return list.length===0;
}
//size 返回队列元素个数
this.size=function(){
return list.length;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
优先队列
看看现实中的案例
- 机场的登记顺序:头等舱和商务舱的乘客要优先于经济舱;或老人和孕妇的要优先于其他乘客;
- 医院病人救治:医生会根据病人的病患程度进行排队;
function PriorityQueue(){
var list=[];
function QueueElement (element, priority){//这个工厂函数,创建每一个元素
this.element = element;
this.priority = priority;
}
this.enqueue = function(element, priority){
var queueElement = new QueueElement(element, priority);
if (this.isEmpty()){
items.push(queueElement); //如果队列为空,就直接添加改元素,否则,就需要比较该元素与其他元素的优先级。
} else {
var added = false;
for (var i=0; i<items.length; i++){
if (queueElement.priority <items[i].priority){
items.splice(i,0,queueElement); //当找到一个比要添加的元素的priority值更大(优先级更低)的项时,就把新元素插入 到它之前(根据这个逻辑,对于其他优先级相同,但是先添加到队列的元素,我们同样遵循先进 先出的原则)。要做到这一点,我们可以用第2章学习过的JavaScript的array类的splice方法。 一旦找到priority值更大的元素,就插入新元素并终止队列循环
added = true;
break;
}
}
if (!added){ //如果要添加元素的priority值大于任何已有的元素,把它添加到队列的末尾就行了
items.push(queueElement);
}
}
}
}
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
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
小结
队列这种数据结构和栈的数据结构类似,都是一种有序的数据集合,不同点是取值方式存在差异;