public class Test {
public static void main(String[] args) {
cycleArrayQueue caq1 = new cycleArrayQueue(4);
caq1.inCycleQueue(1);
caq1.inCycleQueue(2);
caq1.inCycleQueue(3);
caq1.checkEachElement();
System.out.println("-----------------------------");
caq1.outCycleQueue();
caq1.inCycleQueue(8);
caq1.checkEachElement();
System.out.println("-----------");
caq1.outCycleQueue();
caq1.inCycleQueue(6);
caq1.checkEachElement();
System.out.println("-----------------------------------------------------");
caq1.outCycleQueue();
caq1.checkEachElement();
}
}
class cycleArrayQueue{
private int maxSize;// 数组的容量(存储数据的个数-1),因为其中一个空间用来当做判断队列是否已满的标志
private int[] arr;// 存储数据介质——数组
private int front;// 头指针
private int rear; // 尾指针
//构造方法创建环形队列
public cycleArrayQueue(int maxSize){
this.maxSize = maxSize;
arr = new int[this.maxSize];
front = rear = 0;//初始化rear和front
}
//判断队列空
public boolean isEmpty(){
return rear == front;
}
//判断队列满
public boolean isFull(){
return (rear+1)%maxSize == front;
}
//入列
public void inCycleQueue(int n){
if(isFull()){
System.out.println("队列满,无法入列");
}else{
arr[rear] = n;// 为什么要把n给arr[rear]呢? 因为front只有在出队列的时候才会用,
// 而rear会随着入列向后移,所以要把n赋给未后移之前的arr[rear],然后再后移rear.
rear = (rear+1)%maxSize; //考虑数组越界的时候,只需要考虑front和rear都在maxSize-1的情况,
// 其它不用考虑,(想到)++即可(千万别直接写++)。
}
}
//出列
public int outCycleQueue(){
if(isEmpty()){
throw new RuntimeException("队列空,无法出列"); // 这里抛出异常的原因是返回值类型为int,return啥都不好,只能抛出异常了。
}else{
int value = arr[front];
front = (front+1)%maxSize; //考虑数组越界的时候,只需要考虑front和rear都在maxSize-1的情况,
// 其它不用考虑,(想到)++即可(千万别直接写++)。
return value;
}
}
//元素遍历
public void checkEachElement(){
if(isEmpty()){
throw new RuntimeException("队列空,无法遍历");
}else{
for(int i=front;i<front+count();i++){
System.out.printf("arr[%d]=%d\n",i%maxSize,arr[i%maxSize]);//这个地方一定要返回i%maxSize,不然会有arr[4]这种情况出现。
}
}
}
//遍历时需要用的从front到front+count其中的(count)
public int count(){
return (rear+maxSize-front)%maxSize;
}
}
//以下是输出结果,经过测试所有功能全部正常
arr[0]=1
arr[1]=2
arr[2]=3
-----------------------------
arr[1]=2
arr[2]=3
arr[3]=8
-----------
arr[2]=3
arr[3]=8
arr[0]=6
-----------------------------------------------------
arr[3]=8
arr[0]=6
所有注意事项以及“小算法”涉及的点,全部都在注释中,若有疑问,请参考《尚硅谷数据结构——韩顺平》
|