Skip to main content

队列

特点

  • 先进先出 FIFO
  • 实现可以用数组和链表

定义

一种操作受限的线性表数据结构。

举例

  • 顺序队列
  • 链式队列
  • 循环队列(Disruptor)
  • 阻塞队列(ArrayBlockingQueue)
  • 并发队列

顺序队列

用数组实现的队列称之为顺序队列

代码举例


public class ArrayQueue {
// 数组:items,数组大小:n
private String[] items;
private int n = 0;
// head表示队头下标,tail表示队尾下标
private int head = 0;
private int tail = 0;

// 申请一个大小为capacity的数组
public ArrayQueue(int capacity) {
items = new String[capacity];
n = capacity;
}

// 入队操作,将item放入队尾
public boolean enqueue(String item) {
// tail == n表示队列末尾没有空间了
if (tail == n) {
// tail ==n && head==0,表示整个队列都占满了
if (head == 0) return false;
// 数据搬移
for (int i = head; i < tail; ++i) {
items[i-head] = items[i];
}
// 搬移完之后重新更新head和tail
tail -= head;
head = 0;
}
items[tail] = item;
++tail;
return true;
}

// 出队
public String dequeue() {
// 如果head == tail 表示队列为空
if (head == tail) return null;
String ret = items[head];
++head;
return ret;
}
}

上面一个细节就是在没有空间时,需要一次数据搬迁,将head到tail的数据搬迁到下标为0的位置

链式队列

用链表实现的队列称之为链式队列


public class LinkedListQueue {

// 队列的队首和队尾
private Node head = null;
private Node tail = null;

// 入队
public void enqueue(String value) {
if (tail == null) {
Node newNode = new Node(value, null);
head = newNode;
tail = newNode;
} else {
tail.next = new Node(value, null);
tail = tail.next;
}
}

// 出队
public String dequeue() {
if (head == null) return null;

String value = head.data;
head = head.next;
if (head == null) {
tail = null;
}
return value;
}

private static class Node {
private String data;
private Node next;

public Node(String data, Node next) {
this.data = data;
this.next = next;
}

public String getData() {
return data;
}
}

}

如上,链表实现的队列,就减少了数据搬迁的操作。

循环队列(Disruptor)

阻塞队列(ArrayBlockingQueue)

并发队列