环形队列
顾名思义,环形队列就是可以循环使用的队列,个人认为其中的精髓就是取模,能理解这个基本上和队列差不多
注意这里和队列不一样的地方,front和rear都是指向队列的第一个位置而不是-1了
front指向的是起始的值,而rear指向的是数据的后面一个位置,这样是为了区分队满和队空
代码实现
1.创建队列
2.判断队空和队满
就表明队列满了,环形队列永远要留一个空。
(rear+1)%maxsize表明rear前进一格,如果前进一格和front相等了,表明队满了,也就是上述这种情况。
为什么要%maxsize?
因为是一个循环队列,无论rear有多大,逃不了这个队列。
3.添加操作
queue[rear]=n;
rear=(rear+1)%maxsize;
这两步操作相当于为rear指向的位置赋值,然后rear+1
因为是一个循环队列
假设队列的长度为8(0-7)
此时rear为7,也就是此队列的最后一个位置
rear=(rear+1)%maxsize;就可以让你到0,而不是溢出了,达到了循环利用的原则
如果没有超过
假设rear为2,那么rear=(rear+1)%maxsize;其实也无关紧要了,就相当于rear+1
4.取出操作
这里的front也与上面同理
5.显示操作
front+(rear-front+maxsize)%maxsize这个可能有点复杂
还是拿这个举例子
rear-front+maxsize:这个式子相当于取绝对值了
队列长度为8(0-7)
此时rear=2,front=3
rear-front+maxsize=7,也就是这个队列包含数据的个数,至于为什么要取余
再举个例子
rear=6,front=2
rear-front+maxsize=12.这时候取余的作用就出来了
(rear-front+maxsize)%maxsize=4,表示出来了
int i=front;i<front+(rear-front+maxsize)%maxsize;i++
表明从front开始,到front+个数之后结束,遍历
queue[i%maxsize],所以取出的数据同样要取余