对于 Java 来说,数据结构不象 C 语言那样需要自行实现,因为 Java 本身已经提供了丰富的数据结构。例如我们经常用来的 List、Map 等。不过自行实现一些数据结构不仅对我们的逻辑思维能力有帮助,并且让我们更加了解数据结构的底层实现。今天我们来说说 Java 中怎么利用数组来实现队列。
首先了解一下什么是队列:队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。这也就是我们平常经常用说到的先进先出原则(FIFO)。Java 中的 List 就可以作为队列来使用,在队列尾部添加元素则使用 list.add 方法,从队列头部删除元素则使用 list.remove 方法。要用数组来实现,就必需定义进和出的下标,实现方法如下:
public class Queue { /** 默认长度 */ private static final int DEFUALT_LENGTH = 5; /** 队列数据 */ private Object[] objs; /** 队列头 */ private int head = 0; /** 队列尾 */ private int tail = 0; /** 队列可用长度 */ private int length = 0; /** * 初期化一个默认大小的数组 */ public Queue() { this.objs = new Object[DEFUALT_LENGTH]; } /** * 初期化一个指定大小的数组 * * @param int */ public Queue(int l) { if (l > 0) { this.objs = new Object[l]; } else { this.objs = new Object[DEFUALT_LENGTH]; } } /** * 入列 * * @param obj */ public void enQueue(Object obj) { // 满位的场合 if (isFull()) { // 增加队列容量 enlarge(); head = 0; } this.tail = (this.head + this.length) % this.objs.length; this.objs[this.tail] = obj; length++; } /** * 出列 * * @return Object */ public Object deQueue() { if (isEmpty()) { return null; } Object tempObj = this.objs[this.head]; this.objs[this.head] = null; this.head = (this.head + 1) % (this.objs.length); this.length--; return tempObj; } /** * 队列是否满 * * @return boolean */ public boolean isFull() { return this.length == this.objs.length; } /** * 队列是否为空 * * @return boolean */ public boolean isEmpty() { return this.length == 0; } /** * 扩展数组容量 */ public void enlarge() { Object[] tempObjs = new Object[this.objs.length * 2]; System.arraycopy(this.objs, 0, tempObjs, 0, this.objs.length); this.objs = tempObjs; } }