用数组实现。队首出队,队尾进队。
成员变量有:队首front,队尾back,队列长度size,对象数组data。
成员方法有:
构造方法,
获取队列的长度getSize(),
元素出队,在队首出队
元素入队,在对尾入队
public class Queue {
private int front;//队首
private int back;//队尾
private int size;//队列长度
private Object[] data;
public Queue(){//构造函数
data=new Object[10];
}
public int getSize(){//获取队列的长度
return size;
}
public Object dequeue(){//出队,在队首出队
Object o=null;
if(size>0){
size--;
o=data[front];
data[front]=null; //便于gc回收
front=(front>data.length-1)?0:front+1;
}
return o;
}
public void enqueue(Object o){//进队,在队尾进队
if(size>=data.length){
Object[] newData=new Object[data.length*2]; //数组扩容两倍
for(int i=0;i<data.length;++i){ //将原数组的数据copy到新的数组中
newData[i]=data[i];
}
data=newData;
}
data[back]=o;
back++;
size++;
}
}
讨论: 如果经过 10 次入队后,队列似乎是满了。但是有可能队列中只存在几个元素,因为若干元素已经出队了。
那么解决办法是:只要front或back到达数组的尾端,它又绕回了开头,这叫做循环数组。