基于数组的循环队列的Java实现
1、借助数组创建一个循环队列类
package 队列;
/*数组实现的循环队列*/
public class ArrayQueue {
private int first,last,maxSize;
private Object[] storage;
public ArrayQueue(){
this(100);
}
public ArrayQueue(int n){ //构造函数
maxSize=n;
storage=new Object[maxSize];
first=last=-1;
}
public int getLength(){ //取得队列中有效数据长度
if(this.isEmpty())
return 0;
else if(last>=first)
return last-first+1;
else
return (maxSize-first)+(last-0+1);
}
public boolean isFull(){ //判断是否为满队列
return first==0&&last==maxSize-1||first==last+1;
}
public boolean isEmpty(){ //判断是否为空队列
return first==-1;
}
public void enqueue(Object e1){ //进队列操作
if(this.isEmpty()){ //当队列为空时
storage[0]=e1;
first=last=0;
}
else if(!this.isFull()){ //队列不空且不满时
if(last==maxSize-1){ //当last位于最后一个位置时
storage[0]=e1;
last=0;
}else
storage[++last]=e1;
}
}
public Object dequeue(){ //删除队列头元素
if(!this.isEmpty()){
Object temp=storage[first];
if(first==last) //只有一个元素时
first=last=-1;
else if(first==maxSize-1) //不止一个元素且first位于最后位置时
first=0;
else //不止一个元素且first不是位于最后位置时
first++;
return temp;
}
else
return null;
}
public void printAll(){
if(!this.isEmpty()){
if(last>=first){//当first小于last时正常打印
for(int i=first;i<=last;i++)
System.out.print(storage[i]+" ");
}
else{//当first大于last时分两次打印,先打印first到maxSize-1;再打印0到last
for(int i=first;i<maxSize;i++)
System.out.print(storage[i]+" ");
for(int j=0;j<last+1;j++)
System.out.print(storage[j]+" ");
}
}
else
System.out.print("队列已空!");
}
}
2、创建测试类
package 队列;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayQueue q=new ArrayQueue(3);
q.enqueue(2);
System.out.println("队列此时长度为:"+q.getLength()); //1
q.enqueue(1);
System.out.println("队列此时长度为:"+q.getLength()); //2
q.enqueue(4);//3
q.dequeue();//2
System.out.println("队列此时长度为:"+q.getLength()); //2
q.dequeue();
System.out.println("队列此时长度为:"+q.getLength()); //1
q.dequeue();//0
q.enqueue(4);
System.out.println("队列此时长度为:"+q.getLength());//1
q.printAll();
}
}
3、测试结果
队列此时长度为:1
队列此时长度为:2
队列此时长度为:2
队列此时长度为:1
队列此时长度为:1
4