JAVA数据结构之使用数组进行循环队列的实现

2022-10-29 13:29:35

前面的博客实现了普通的队列,但是不可以重用,然后现在就要用循环队列来解决它的问题。
普通队列的地址:普通队列
数组模拟环形队列
1.front变量的含义做一个调整:front指向队列的第一个元素,也就是front初始值为0
2.rear变量的含义做一个调整,rear指向队列的最后一个元素的后一个位置,可以空出一个空间作为约定,rear初始值为0
3.当队列满时,条件是(rear+1)%maxsize = front;
4.当队列为空时,rear = front;
5.队列中有效数据的个数,(rear+maxsize-front)%maxsize;
这些就是实现循环队列要注意的一些点

classCircleArray{privateint maxsize;//队列的容量privateint front;//队列头指针,指向队列头的第一个元素 front=0privateint rear;//队列尾指针,指向队列的最后一个数据的后一个元素   rear=0privateint[] arr;//用数组来模拟队列publicCircleArray(int Maxsize){this.maxsize= Maxsize;
        arr=newint[maxsize];//初始化队列
        front=0;
        rear=0;}//判断队列是否满publicbooleanisFull(){return(rear+1)% maxsize== front;}//判断队列是否为空publicbooleanisEmpty(){return rear== front;}//向队列中加入数据publicvoidaddQueue(int n){//判断队列是否满if(isFull()){
            System.out.printf("队列已经满了,不难再加入数据\n");return;}
        arr[rear]= n;
        rear=(rear+1)% maxsize;//尾指针向后移动}//从队列中取出数据publicintgetQueue(){//先判断队列是否为空if(isEmpty()){thrownewRuntimeException("队列为空,不能取出数据\n");}//先分析front指向队列第一个数据//先把front对应的值保留到一个对应的变量//将front后移,考虑取模//将临时变量值返回int value= arr[front];
        front=(front+1)% maxsize;return value;}//显示队列的所有数据publicvoidshowQueue(){//判断队列是否为空if(isEmpty()){
            System.out.printf("队列为空,没有数据\n");return;}//从 front 开始遍历,遍历的个数也需要改变for(int i= front; i< front+size(); i++){
            System.out.printf("arr[%d]=%d\n",i% maxsize,arr[i% maxsize]);}}//当前队列有效个数publicintsize(){return(rear+ maxsize- front)% maxsize;}//取出队列的头数据publicintheadQueue(){//判断队列是否为空if(isEmpty()){thrownewRuntimeException("队列为空,没有头数据\n");}return arr[front];}}

这就实现了循环队列,代码里面在一些关键的地方有注释,
但是要注意的是循环队列的存储量比普通队列的存储量少1。就是你有容量为3的数组,但是你只可以存储两个数据。

  • 作者:KEY_GSY
  • 原文链接:https://blog.csdn.net/weixin_43404016/article/details/105177325
    更新时间:2022-10-29 13:29:35