/**
* 基于数组实现的对列
*/
public class ArrayQueue {
private String item[];//字符串数组实现队列
private int n=0;//对列元素个数
private int head=0;//对头元素下标
private int tail=0;//队尾元素下标
//初始化
public ArrayQueue(){}
public ArrayQueue(int capacity){
this.item = new String[capacity];//申请一个固定大小capacity 的字符串数组空间
this.n=capacity;
}
//入队
public boolean enQueue(String item){
if(tail==n) return false;
this.item[tail++]=item;
return true;
}
//出队
public String deQueue(){
if(head==tail) return null;
String he=item[head++];
return he;
}
}
@Test
public void test(){
ArrayQueue aq=new ArrayQueue(3);
aq.enQueue("1");
aq.enQueue("2");
aq.enQueue("3");
System.out.println(aq.deQueue());
System.out.println(aq.deQueue());
System.out.println(aq.deQueue());
aq.enQueue("5");
System.out.println(aq.deQueue());
}
在这当中可以明显的看出来:
当入队在出队后,再添加元素,就会返回null ,这时的head ,和tail 指向同一个位置说明次队列为空,也就不能再填加进去元素了。
为解决这个问题,我们可以把数组的元素向前搬移,实际上,我们并不需要在每次出队时搬移数据。只有当 tail 指针移动到数组的最右边是时,如果有新的数据要入队,我们在集中触发一次元素搬移操作将 head 指针到 tail 指针的数据,整体搬移到数组,从零开始的位置。
基于这个思想,我把入队操作做了优化:
public boolean enQueue(String item){
if(tail==n) {
if (head==0) return false;//tail==n&& head==0 ,表示对列满
for(int i=head;i<tail;i++){
this.item[i-head]=this.item[i];//数据搬移到前面
}
tail=tail-head;
head=0;
}
this.item[tail++]=item;
return true;
}
当我再次测试时就可以重复添加数据
如图为再次测试结果: