我们在超市付款时,先排队的总是先付款完成(排除插队),队列的一个特点就是“先进先出,后进后出”
MaxSize是数组的长度,那MaxSize-1就是队列的最大下标了,front和rear是队列前后的下标,front是取出数据时改变,rear时添加数据时改变
尾指针rear随着添加数据而增加,当rear指向队列最大下标时为满,即rear==Maxsize
不满时,尾指针rear初始值指向-1,所以添加前需要先将进行上移(即rear++),然后对rear进行赋值当rear==front时(即上图最左边),即为空
不为空将尾指针front上移,即进行front++操作
根据上面的代码发现,数组只能使用一次,取出数据后的空位置也不能进行添加,需要引入循环队列来解决问题
预留一个位置判断队列是否满:
当取出一个后发现队列没满,可以继续添加:
代码实现
1 private int Maxsize; 2 private int arr[]; 3 private int front;//默认是0 4 private int rear;//默认是0 5 6 //构建函数 7 public CircleArray(int arrMaxsize){ 8 Maxsize=arrMaxsize; 9 arr=new int[Maxsize]; 10 } 11 //判断数组是否时空 12 public boolean isEmpty(){ 13 return rear==front; 14 } 15 16 //判断数组是否是满的 17 public boolean isFull(){ 18 return (rear+1)%Maxsize==front; 19 } 20 21 //为数组添加数据 22 public void add(int n){ 23 if (isFull()){ 24 System.out.println("数组已经满了"); 25 return; 26 } 27 arr[rear]=n; 28 rear=(rear+1)%Maxsize; 29 } 30 //删除数组数据 31 public int remove(){ 32 if (isEmpty()){ 33 new RuntimeException("数组是空的"); 34 } 35 //先把数据值给一个局部变量 36 int a=arr[front]; 37 front=(front+1)%Maxsize; 38 return a; 39 } 40 41 //获取头数据 42 public int getHeadDate(){ 43 if (isEmpty()){ 44 new RuntimeException("数组是空的"); 45 } 46 47 return arr[front]; 48 } 49 //显示所有数据 50 public void allDate(){ 51 if (isEmpty()){ 52 new RuntimeException("数组是空的"); 53 } 54 55 for (int i=front;i<front+size();i++){ 56 System.out.printf("arr[%d]=%d\n",i%Maxsize,arr[i%Maxsize]); 57 } 58 59 } 60 61 //有效数据长度,(Maxsize-front+rear)%Maxsize 当rear<front时,长度是(maxsize-front)+(rear-0) 62 public int size(){ 63 if (isEmpty()){ 64 return 0; 65 } 66 return (Maxsize-front+rear)%Maxsize; 67 }
转载于:https://www.cnblogs.com/han200113/p/11526956.html