《算法和数据结构》之队列

基本概念

队列(Queue)是一种先进先出(FIFO)的结构,类似于生活中的“独木桥”、“排队”等

这里写图片描述

这里写图片描述

对于Queue,核心api如下:

方法 描述
void enQueue(T s) 向队列中添加一个新的元素
T deQueue() 移除队列中最早添加的元素
boolean isEmpty() 队列是否为空
int size() 队列中元素的个数

队列的链表实现

deQueue方法就是返回链表中第一个元素

public T deQueue(){
    T temp = first.item;
    first = first.next;
    number--;
    if(isEmpty()){
        last = null;
    }
    return temp;
}

enQueue,即在链表的末尾增加新的元素

public void enQueue(T item){
    Node oldLast = last;
    last = new Node();
    last.item = item;
    if(isEmpty()){
        first = last;
    }else{
        oldLast.next = last;
    }
    number++;
}

队列的数组实现

用数组来保存数据,另外需要定义两个变量head和tail分别表示Queue的首尾元素。

这里写图片描述

当添加元素到队列时,tail的位置需要加1,将元素放到尾部,当删除元素时,head的位置需要减1,并返回。

public void enQueue(T item){
    if((head-tail+1) == item.length){
        reSize(2*item.length);
    }
    item[tail++] = item;
}

public T deQueue(){
    T temp = item[--head];
    item[head] = default(T);
    if(head > 0 && (tail-head+1) == item.length/4 ){
        reSize(item.length/2);
    }
    return temp;
}

public void reSize(int newSize){
    T[] temp = new T[newSize];
    int index = 0;
    for(int i = head;i < tail; i++){
        temp[++index] = item[i];
    ]
    item = temp;
}

队列的使用场景

  1. 排队
  2. 播放器上的播放列表
  3. 数据流对象
  4. 异步的数据传输结构
  5. 解决共享资源的冲突访问,如打印机的打印队列
  6. 消息队列
  7. 交通状况模拟
  8. 呼叫中心用户等待队列

猜你喜欢

转载自blog.csdn.net/maohoo/article/details/81480527