持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第10天,点击查看活动详情。
循环队列
在顺序表实现的队列中,当队尾指针已经到数组的上界,不能再有入队操作,但其实数组中还有空位置,这就叫做“假溢出”,而我们可以采用循环队列解决假溢出。
要想实现循环队列重点在于如何规划循环队列的插入方法,让数组指针到达数组上界时能自动回到数组下界,这一点我们使用求余
就能实现。
int num = 0;
while(true)
num = ++num % 10;
在以上的几行代码中,我们在循环中不断令num
自增,同时也不断令num
和10求余数。因为%
是求两个数的余数,所以所有小于10
的数与10
求余的结果都是其本身,如:1 % 10 = 1、5 % 10 = 5。利用求余的这一特点,我们就可以令num
只能取0~9
的正整数,这也就达到了我们的第一步“循环”
。
接下来,我们再继续实现循环队列。
首先是插入
的方法
public void add(int value)
{
endIndex = ++ endIndex % this.arr.length;
if(endIndex == headIndex)
{
endIndex--;
System.out.println("这个队列已经满了哦");
return;
}
arr[endIndex] = value;
}
因为我们采用的循环的结构,所以我们如果一直向队列中添加但不取出的话,尾指针很有可能会盖掉头指针,从而造成数据丢失。所以我们需要对此进行判断,若是在尾指针自增后与头指针相等则说明此时循环队列已满,无法再添加元素。
接下来的取出
方法也是同理,若是在头指针自增后与尾指针相等则说明此时循环队列已空,无法再取出元素。
public int pop()
{
headIndex = ++headIndex % this.arr.length;
if(headIndex == endIndex)
{
headIndex--;
System.out.println("你不能从一个空队列中取出元素");
return;
}
return arr[headIndex];
}
到此,我们基于顺序表实现的循环队列已经基本实现了。
小结
在上篇中我们介绍了循环队列令顺序表实现的队列可以复用,而在本篇中实现了循环队列。
天天学习,加速成长!
希望与各位一起变得越来越强!