思路如下(环形队列):
- front:front指向队列的第一个元素,即arr[front]就是数组的第一个元素,front的初始值是0;
- rear:rear指向队列最后一个元素的后一个位置,因为希望空出一个空间作为约定,rear的初始值是0;
- 当队列满时,条件是(rear+1)%maxSize==front;(即front和rear位置相邻)
- 当队列为空时,条件是rear==front;
- 当我们这样分析时,队列的有效数据的个数是:(rear+maxSize-front)%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]; front=0; rear=0; } //判断队列是否满 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("队列为空"); } //1、先把front对应的值保存到一个临时变量 //2、将front后移,考虑取模---->front=(front+1)%maxSize //3、返回临时保存的变量 int res=arr[front]; front=(front+1)%maxSize; return res; } //显示队列所有数据 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]; } }