队列是一种先进先出的数据结构,在尾部插入元素,在头部取出元素

头指针-front指向队列中的第一个元素

尾指针-rear指向队列中最后一个元素的下一个位置

数据结构(java)——循环队列的简单实现_循环队列

这样做就是会牺牲一个数组的位置(假如我给循环队列中分配8个位置,但实际只能存储7个元素,只是为了判断循环队列是否已满)

PS:关于front和rear的位置的运算,首先应该想到的是取余运算(防止数组越界,以此来循环)

private int front;//头指针
private int rear;//尾指针
private int maxSize;//定义循环队列的大小
private Object[] queue;//定义循环队列
public Queue(int maxSize){//初始化队列
this.maxSize = maxSize;
queue = new Object[maxSize];
}

下面五种情况是实现循环队列的关键

判断一个队列是否为空===》front==rear

判断一个队列是否已满===》(rear+1)%maxSize==front

求出循环队列中元素的个数===》(rear+maxSize-front)%maxSize

取出一个元素(调用getQueue()方法)===》front = (front+1)%maxSize

添加一个元素(调用addQueue()方法)===》rear = (rear+1)%maxSize

展示循环队列中的元素也要注意遍历方法的运用

public void showQueue(){//展示队列中的元素
for (int i=front;i<front+size();i++){//这里需要特别注意遍历方式
System.out.print(queue[i%maxSize]+" ");
}
}

下面就是循环队列的实现

public class Queue{
private int front;
private int rear;
private int maxSize;
private Object[] queue;
public Queue(int maxSize){//初始化队列
this.maxSize = maxSize;
queue = new Object[maxSize];
}
public int size(){//返回当前存储数据的个数
return (rear+maxSize-front)%maxSize;
}
public boolean isEmpty(){//判断队列中元素是否为空
return front == rear;
}
public boolean ifFull(){
return (rear+1)%maxSize == front;
}
public void showQueue(){//展示队列中的元素
for (int i=front;i<front+size();i++){
System.out.print(queue[i%maxSize]+" ");
}
}
public void addQueue(Object e){//向队列中添加元素
if(ifFull()){
System.out.println("队列已满");
return;
}
queue[rear] = e;
rear = (rear+1)%maxSize;
}
public Object getQueue(){//取出队列中的元素
if(isEmpty()){
throw new IndexOutOfBoundsException("队列为空,请添加数据");
}
Object value = queue[front];
front = (front+1)%maxSize;//front指针后移一位
return value;//返回取出的元素
}
public Object getHeadQueue(){//获取队列中头指针所指的元素
Object value = queue[front];
return value;
}

}

最后可以自己写一个主类来调用循环队列中的方法感受一下