public interface Queue {
//返回队列的大小
public int getSize();
//判断队列是否为空
public boolean isEmpty();
//数据元素入队
public void enQueue(Object obj);
//队首元素出队
public Object deQueue() throws QueueEmptyException;
//展现队首元素
public Object peek() throws QueueEmptyException;
}
2.自定义异常
/*
* 队列为空抛出该异常
*/
public class QueueEmptyException extends RuntimeException {
public QueueEmptyException(String err) {
super(err);
}
}
3.实现接口
/*
* 队列用循环数组实现
*/
public class QueueArray implements Queue {
// 队列默认大小
private static final int CAP = 7;
// 数组元素数组
private Object[] elements;
// 数组的大小
private int capacity;
// 队首指针
private int front;
// 队尾指针,指向队尾的后一个元素
private int rear;
public QueueArray() {
this(CAP);
}
public QueueArray(int cap) {
capacity = cap + 1;
elements = new Object[capacity];
front = rear = 0;
}
/*
* 返回队列大小
*/
public int getSize() {
return (rear - front + capacity) % capacity;
}
/*
* 判断队列是否为空
*/
public boolean isEmpty() {
return front == rear;
}
/*
* 数据元素入队
*/
public void enQueue(Object obj) {
// 如果队列的大小和数组大小-1相等,数组扩容,要给队列留一个空间,作为判断队列为空或者满的条件
if (getSize() == capacity - 1)
expandSpace();
elements[rear] = obj;
rear = (rear+1)%capacity;
}
/*
* 数组扩容
*/
public void expandSpace() {
Object[] a = new Object[elements.length * 2];
int i = front, j = 0;
//将front到rear的前一个元素全部复制到另外一个数组
while(i!=rear){
a[j++] = elements[i];
i = (i+1)%capacity;
}
elements = a;
capacity = elements.length;
//设置新的队首、队尾指针
front = 0;
rear = j;
}
/*
队首元素离队
*/
public Object deQueue() throws QueueEmptyException {
if(isEmpty())
throw new QueueEmptyException("队列为空,GG");
Object obj = elements[front];
elements[front] = null;
front = (front+1)%capacity;
return obj;
}
/*
取出队首元素,不是离队操作
*/
public Object peek() throws QueueEmptyException {
if(isEmpty())
throw new QueueEmptyException("队列为空,GG");
return elements[front];
}
}