//循环队列 /* 初始化 front:代表队头 rear:代表队尾的下一个位置 判断队列是否满 (rear+1)%maxSize==front 判断队列是否空 front==rear; 入队 rear=(rear+1)%maxSize 出队 front=(front+1)%maxSize; 队列长度 rear-front+maxSize)%maxSize; */
public class CircleQuene {
private int maxSize;
private int quene[];
private int front; //队头,用于出队
private int rear; //队尾,用于入队
public CircleQuene(int size) //初始化
{
this.maxSize=size;
quene=new int[this.maxSize]; //此处不是int quene[]
front=0; //指向队头
rear=0; //指向队尾的下一个位置
}
public Boolean isFull() //判断队列是否满
{
return (rear+1)%maxSize==front;
}
public Boolean isEmpty() //判断队列是否空
{
return front==rear;
}
public void add(int value) //入队列 rear在往上增加
{
if(isFull())
System.out.println("队列已经满");
quene[rear]=value;
rear=(rear+1)%maxSize;
}
public int getQuene() //出队列 front在往上增加
{
if(isEmpty()) {
throw new RuntimeException("");
}
int value=quene[front];
front=(front+1)%maxSize;
return value;
}
public void list() //遍历队列,从队头到队尾
{
if(isEmpty())
System.out.println("队列为空");
int i;
for(i=front;i<=front+getSize();i++)
{
System.out.printf(" %d\t",quene[i%maxSize]);
}
}
public int showHead() //展示队头(第一个元素)
{
return quene[front];
}
public int getSize() //获取队列真实的元素个数
{
if(isEmpty()){
System.out.println("队列为空");
}
return (rear-front+maxSize)%maxSize;
}
}
测试代码如下:
public class CircleQueneTest {
public static void main(String[] args) {
CircleQuene arrayquene=new CircleQuene(10);
int i;
for(i=0;i<9;i++)
{
arrayquene.add(i); //添加
}
System.out.println("遍历输出为");
arrayquene.list();
System.out.println("");
try {
for (i = 0; i < 10; i++) {
System.out.printf("%d\t", arrayquene.getQuene()); //该方法有抛出异常,需要处理
}
}
catch(Exception e)
{
System.out.println("队列已经为空~");
}
System.out.printf("队头元素是 %d",arrayquene.showHead());
}
}