队列
队列是一个有序列表,可以用数组
或是链表
实现。你可以想象下10年前去火车站排队买票的场景,在同一个窗口排成长长的队,先来的先买,后来的只能站在最后面排队,不允许插队。先来的人先买票(先进先出),后来的后买票(后进后出)。
遵循先入先出
的原则,即:先存入队列的数据,要先取出,后存入的要后取出。
示意图:
队列最基本的两个操作:入队
(enqueue),放一个数据到队列的尾部;出队
(dequeue)从队列头部取一个元素。
顺序队列和链式队列
用数组实现的队列叫顺序队列,用链表实现的队列叫链式队列。
本篇文章我们先分析下基于数组实现的顺序队列:
队列有两个指针,一个是head指针,指向队头;一个是tail指针,指向队尾。
-
队列的初始状态:
head = 0; tail = 0;
队列的大小为size,队列数组的第一个元素下标为0,最后一个元素的下标为size-1。
-
入队
当a,b入队之后,队列头指针head不变还是指向下标为0的位置,队列尾指针tail指向下标为2的位置,即下一个入队元素的位置,当tail == size 时表示队列已满。 -
出队
当a出队之后,队列头指针head向后移动一个位置,指向队列的第一个有值的元素,队列尾指针tail指向不变,当head == tail 时表示队列为空。
用代码实现上述队列的入队和出队过程。
public class ArrayQueue {
private Integer[] items;
private int size;
private int head = 0;
private int tail = 0;
public ArrayQueue(int size) {
this.size = size;
items = new Integer[size];
}
/**
* 入队列
* @param item
* @return
*/
public boolean enqueue(int item) {
// 判断队列是否已满
if(tail == size) {
return false;
}
items[tail] = item;
tail++;
return true;
}
/**
* 出队列
* @return
*/
public Integer dequeue() {
// 判断队列是否为空
if(head == tail) {
return null;
}
Integer item = items[head];
head++;
return item;
}
/**
* 打印队列中所有元素
*/
public void list() {
for(int i = head; i < tail; i++) {
System.out.println(items[i]);
}
}
}