“携手创作,共同成长!开启掘金成长之旅!这是我参与「掘金日新计划 · 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]);
}