|
队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。这也就是我 们平常经常用说到的先进先出原则(FIFO)。java 中的 List 就可以作为队列来使用,在队列尾部添加元素则使用 list.add 方法,从队列头部删除元素则使用 list.remove 方法。
public interface Queue {
/**
* 入队: 从队尾加入一元素
*
* @param target
*/
public void add(E target);
/**
* 出队: 移走队头元素
*
* @param target
* @return 当前队头元素
*/
public E remove();
/**
* 当前队列中的元素个数
*/
public int size();
/**
* 判断当前队列是否为空
*
* @return
*/
public boolean isEmpty();
/**
* 只是返回队头元素
* @return
*/
public E front();
}
/**
*基于数组的队列
* @param
*/
public class ArrayQueue implements Queue {
private E[] data;
private int size ;//队列中对象数量
private int front ;// 队列中第一个对象位置
private int rear ;//队列中当前对象位置
public ArrayQueue() {
data = (E[]) new Object[10];
size = 0;
front = 0;
rear = 0;
}
public void add(E target) {
if( isFull() ){
enlarge();
front = 0;
}
rear = (front + size) % data.length;
data[rear] = target;
size++;
}
public E front() {
if (isEmpty()) {
throw new RuntimeException("队列为空!");
}
return data[front];
}
public boolean isEmpty() {
return size == 0;
}
public E remove() {
if (isEmpty()) {
throw new RuntimeException("队列为空!");
}
E tempData = data[front];
data[front] = null;
front = (front + 1) % (data.length);
size--;
return tempData;
}
public int size() {
return size;
}
/**
* 判断当前队列是否已满
*
* @return
*/
public boolean isFull() {
return size == data.length;
}
/**
* 将数组容量扩大两倍
*
*/
public void enlarge() {
E[] newData = (E[]) new Object[data.length * 2];
System.arraycopy(data, 0, newData, 0, data.length);
data = newData;
newData = null;
}
}
测试代码:
public void testArrayQueue(){
ArrayQueue q = new ArrayQueue();
q.add("a");
q.add("b");
q.add("c");
q.add("d");
q.add("e");
q.add("f");
q.add("g");
q.add("h");
q.add("i");
q.add("j");
q.add("k");
q.add("l");
q.add("m");
while( !q.isEmpty() ){
String temp = q.remove();
System.out.println(temp);
}
} |
|