队列实现:通过充分的利用数组的功能,将数组看成是一个环形的(通过取模的方式来实现就可)
分析说明:
(1)尾索引的下一个为头索引时表示队列满,即将队列容量空出一个作为约定,这个时候在判断队列满的时候就注意(rear+1)%maxSize==front表示队满;
(2)rear==front表示队空;
(3)队中的有效数据个数:(rear-front+maxSize)%maxSize;
代码实现:
class CircleArray{
private int maxSize; //表示数组的最大容量
private int front; //队列的头指针,指向的就是队列的第一个元素
private int rear; //队列的尾指针,指向的是队列最后一个元素的后一个位置
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=(rear+1)%maxSize;
}
//删除队列中的元素
public int getQueue(){
//判断队列是否为空
if (isEmpty()){
throw new RuntimeException("队列空,不能取数据");
}
//front是队列的第一个元素
//1.先将front对应的值保存到临时变量上
int value=arr[front];
//2.将front后移,要考虑取模
front=(front+1)%maxSize;
//3.返回保存的临时变量
return value;
}
//显示队列的所有数据
public void showQueue(){
//遍历
if (isEmpty()){
System.out.println("队列空的,没有数据");
return;
}
//从front开始遍历,遍历队列中有效元素个数的次数
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 headQueue(){
if (isEmpty()){
throw new RuntimeException("队列空的,没有数据");
}
return arr[front];
}
}