队列(数组模拟环形队列)(1)

86 阅读3分钟

“携手创作,共同成长!开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情

数组模拟环形队列的创建

思路如下:

1)front变量的含义:front就指向队列的第一个元素,也就是说arrary[front]就是队列的第一个元素。front的初始值为0,front=0

2)rear变量的含义:rear指向队列的最后一个元素的后一个位置。希望预留出一个空间做为约定。rear的初始值为0,rear=0

3)当队列满时,条件是(rear+1)%maxsize==front【判断是否为满,队列最后的位置的后一个位置就相当于maxsize的值,那么此时再加上1就会比maxsize更大,而模除得到的结果是1,front代表的是队列第一个元素位置,初始值是0,若此时的结果与front相等,则队列是满的】

4)当队列为空时,条件是rear==front【判断是否为空,当两个值都不变时说明队列为空】

5)其中,队列中有效的数据个数是(rear+maxsize-front)%maxsize 【想要重复循环就模除最大值,假设最大值是8,在取模时,任意大于8的数得到的结果都只能小于8,只要超出就会从0开始】

6)通过对数组模拟队列进行修改,可以得到数组模拟环形队列

 

使用数组模拟环形队列-编写一个CircleArray类

代码实现


**private** **int** maxsize; //数组的最大容量

//front就指向队列的第一个元素,也就是说arrary[front]就是队列的第一个元素。

//front的初始值为0,默认即为0

**private** **int** front;

//队列尾

//rear指向队列的最后一个元素的后一个位置

**private** **int** rear;

**private** **int** array[]; //用于存放数据,模拟队列

//创建队列的构造器,用于初始化化数据

**public** CircleArray(**int** arraymaxsize) {

maxsize=arraymaxsize;

array=**new** **int**[maxsize];

}

//判断队列是否是满的

**public** Boolean isFull() {

**return** (rear+1)%maxsize==front;

}

//判断队列是否是空的

**public** Boolean isNull() {

**return** rear==front;

}

//将数据添加到队列中

**public** **void** addqueue(**int** n) {

//判断是否满了

**if** (isFull()) {

System.***out***.println("队列已满,不能存放数据");

**return**;

}

array[rear]=n;  //直接将数据加入

rear=(rear+1)%maxsize;//将rear后移,必须使用模除将rear重置,否则不能循环

}

//将数据移除队列中

**public** **int** getqueue() {

//判断是否为空

**if** (isNull()) {

**throw** **new** RuntimeException("队列为空,没有数据");

}

//由于front是第一个数列位置

//需要先把front的值存在一个变量当中

//然后再把front增加,注意要进行模除

//将保存的变量返回

**int** value=array[front];

front=(front+1)%maxsize;

**return** value;

}

//显示队列中的所有数据

**public** **void** showqueue() {

//判断是否为空

**if** (isNull()) {

System.***out***.println("队列为空,无数据");

**return**;

}

//遍历数据可以从front开始,结束为front+有效数据的个数即可

//其中(rear-front+maxsize)%maxsize代表有效数据的个数

//i一定要模除maxsize,因为在执行过程中i可能会从大的值模除成小的值

**for**(**int** i=front;i<front+num();i++) {

System.***out***.printf("arr[%d]=%d\n",i%maxsize,array[i%maxsize]);

}

}

//求有效数据个数

**public** **int** num() {

**return** (rear-front+maxsize)%maxsize;

}

//显示队列头数据

**public** **int** headerqueue() {

//判断是否为空

**if** (isNull()) {

**throw** **new** RuntimeException("队列为空,没有数据");

}

**return** array[front];

}

}

代码要点:

1>front和rear的初始值为0,默认即为0,可以不用在构造器初始化中体现

2>由于front是第一个数列位置,需要先把front的值存在一个变量当中,然后再把front增加,注意要进行一定要模除,最后将保存的变量返回

eg:int value=array[front];

front=(front+1)%maxsize;

return value;

3>直接将数据加入rear位置后,再将rear后移,必须使用模除将rear重置,否则不能循环

eg:array[rear]=n;  

rear=(rear+1)%maxsize;

4>遍历数据可以从front开始,结束为front+有效数据的个数即可。其中(rear-front+maxsize)%maxsize代表有效数据的个数。i一定要模除maxsize,因为在执行过程中i可能会从大的值模除成小的值,假如不设置模除的会造成数组越界

eg:for(int i=front;i<front+num();i++) {

  System.***out***.printf("arr[%d]=%d\n",i%maxsize,array[i%maxsize]);

}