queue----队列


2020-6-2 前端基础

Queue---队列

队列和栈非常相似,只是使用了不同的原则,它遵循先进先出原则的一组有序的项,而非后进先出原则;队列在尾部添加新元素,在顶部移除元素;

创建一个类模拟

function Queue(){
  var list=[];
}
//Queue类和Stack类非常相似;
1
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

优先队列

看看现实中的案例

  • 机场的登记顺序:头等舱和商务舱的乘客要优先于经济舱;或老人和孕妇的要优先于其他乘客;
  • 医院病人救治:医生会根据病人的病患程度进行排队;
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

小结

队列这种数据结构和栈的数据结构类似,都是一种有序的数据集合,不同点是取值方式存在差异;

Thomas: 6/3/2020, 5:28:47 PM