上一篇文章介绍了队列的基本概念,并且通过画图的形式分析了入队出队的过程。本篇文章我将通过Java代码实现顺序队列。
话不多说,先上代码。
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]);
}
}
}
首先创建了一个类ArrayQueue,见名知义,这是一个通过数组实现的顺序队列。Integer[] items
使用 Integer类型的数组来存储队列的元素,通过构造方法指定队列的容量size,ArrayQueue内部创建了两个变量head
和tail
用于指向队头和队尾。这里有两个需要特别注意的地方:
- 入队时如何判断队列满了
tail == size
- 出队时如何判断队列为空
head == tail
随着不断的入队和出队操作,最后head和tail都会一直向队尾移动,当head == tail && tail == size
的时候,如下图所示,即使队列有空闲空间也无法向队列中添加任何元素了,也就是说,我们上面创建的队列只能使用一次。
如何解决这个问题呢,我们可以使用循环队列,现在的队列是一条直线,如果我们把首尾相连就形成了一个环,如下图所示:
更多关于循环队列的内容,我将在下篇文章介绍。