数组模拟环形队列:
思路:
1.front变量的含义:front就指向队列的第一个元素,也就是说arr[front]就是队列的第一个元素。
front的初始值=0
2.rear变量的含义:rear指向队列的最后一个元素的后一个位置,因为空出一个空间作为预定。rear的初始值=0
3.当队列满时,条件是(rear+1)%maxSize==front
4.当队列为空的条件,rear==front
5.队列中有效的数据的古树(rear+maxSize-front)%maxSize
创建环形队列:
class CircleArray {
private int maxSize; //表示数组最大容量
private int front; //队列头
//front变量的含义:front就指向队列的第一个元素,也就是arr[front]
//front的初始值=0
private int rear; //队列尾
//rear变量的含义:rear就指向队列的最后一个元素的后一个位置
//rear的初始值=0
private int arr[] ; //存放数据,模拟队列
public CircleArray(int arrMaxSize){
maxSize=arrMaxSize;
arr=new int[maxSize];
}
判满:
public boolean isFull(){
return (rear+1)%maxSize==front;
}
判空:
public boolean isEmpty(){
return rear==front;
}
入队:
public void addQueue(int n){
if (isFull()){
System.out.println("队列满");
return;
}
arr[rear]=n;
rear=(rear+1)%maxSize;
}
出队:
public int getQueue(){
if (isEmpty()){
throw new RuntimeException("队空");
}
int value=arr[front];
front=(front+1)%maxSize;
return value;
}
遍历:
public void showQueue(){
if (isEmpty()){
System.out.println("队空");
return;
}
for (int i=front;i<front+size();i++){
System.out.printf("arr[%d]=%d\n",i%maxSize,arr[i%maxSize]);
}
}
返回队列中有效数据个数:
public int size(){
return (rear+maxSize-front)%maxSize;
}
返回队头:
public int headQuqu(){
if (isEmpty()){
throw new RuntimeException("队列空");
}
return arr[front];
}
测试:
当maxsize值为4,故有效数据为3个。
添加数据:添加数据 10 、20 、30
添加40显示队满,说明有一个空间为约定空间,有效空间为3
显示数据(遍历):
取出一个数据再添加一个数据:
可以取出并添加,约定空间为动态空间向后移了一位,此时队头数据为20
取出20添加数据50:
这是队列最后一个元素的下标为0,说明队列是环形,数组实现环形队列成功。