先定义队列的接口
public interface IQueue<T> {
/*
* 初始化一个空队列
*/
IQueue InitQueue();
/*
* 销毁一个队列
*/
IQueue DestroyQueue();
/*
* 清空一个队列
*/
IQueue ClearQueue();
/*
* queue charge isEmpty()
*/
Boolean isEmpty();
/*
* return queue`s length;
*/
Integer QueueLength();
/*
* return the head queue
*/
T GetHead();
/*
* insert the tail queue
*/
Boolean EnQueue(T t);
/*
* delete the head ,or out queue
*/
T DeQueue();
}
将队列接口实现
public class ArrayQueue<T> implements IQueue<T> {
/**
* 数组型队列
* <p>
* 同样需要一个头指针,一个尾指针 当头指针=尾指针=0时候为空 需要实现分配一个固定大小的数组
* 正常情况下下,尾指针永远指向队尾元素的下一个位置,比如说队尾元素在0 尾指针则在1
* <p>
* 注意!:数组型队列有很大的劣势,容易造成存储空间浪费,而且不易扩容。 比如说,最大空间为6的数组队列,
* 进去了6个了元素,然后从队头出去了5个元素,此时,仍然不能插入新的元素
* 因为队尾指针仍然指向第6个元素,其仍然占据了最后一个位置,而队头是不允许插入的。这样造成前面5个位置浪费。
* <p>
* 解决方法:1.元素移动位置,出队一个 后面的元素往前挪。 缺点:每次出队都需要移动位置 很麻烦 效率也低 2.动态扩容, 缺点:浪费了前面的空间
* 3.最佳解决方案:构造环形队列
*/
private Integer size;
private Integer header;
private Integer tail;
private final Integer length = 6;
private Object[] arr;
@Override
public IQueue InitQueue() {
// TODO Auto-generated method stub
arr = new Object[length];
tail = header = size = 0;
return this;
}
@Override
public IQueue DestroyQueue() {
// TODO Auto-generated method stub
arr = null;
tail = header = size = 0;
return this;
}
@Override
public IQueue ClearQueue() {
// TODO Auto-generated method stub
tail = header = size = 0;
for (int i = 0; i < arr.length; i++) {
arr[i] = null;
}
return this;
}
@Override
public Boolean isEmpty() {
return header == tail ? true : false;
}
@Override
public Integer QueueLength() {
// TODO Auto-generated method stub
return size;
}
@Override
public T GetHead() {
// TODO Auto-generated method stub
return (T) arr[header];
}
@Override
public Boolean EnQueue(T t) {
// TODO Auto-generated method stub
if (size >= length)
return false;
if (header == tail) {
header = 0;
arr[header] = t;
tail =1;
size++;
return true;}
else {
arr[tail]=t;
tail = tail +1;
size++;
return true;}
}
@Override
public T DeQueue() {
// TODO Auto-generated method stub
if(header == tail) {
return null;
}else {
T t = (T)arr[header];
header=header-1;
size--;return t;
}
}
}