数据结构与算法
单队列ArrayQueue、环形队列CircleArrayQueue
1. 单队列
队列是一个有序列表,可以使用数组或链表来实现。
先入先出,先存入队列的数据先取出,如排队。

单队列的3个属性:
MaxSize表示队列最大容量rear表示尾指针,指向队列末尾,记录该数据的下标,随着数据输入而改变。- 而
front表示头指针,一般让它指向队列头的前一个位置,记录队列头的前一个下标,先自增后取值。
单队列生命周期
开始时,rear与front均指向-1,这是初始状态。
每把一个数据放入队列,尾指针rear就会+1。
当rear=MaxSize-1时,队列满。
每把一个数据从队列中取出,头指针front+1。
当front==rear时,即头指针与尾指针指向同一处,此时队列为空。
无法再取,所以,front<=rear。
单队列使用完一次后,便不能再次使用。
单队列数组实现
1 | package Queue; |
2. 环形队列
相比单队列,环形队列属性设定有所变动:

属性的设定
初始时front = rear = 0,而不是-1rear指向队列尾数据的下一个空间,在尾数据后预留一个空间,即rear指向的位置不放值。(预留空间是为了区分队列空和队列满,空元素作为队尾的标志)front直接指向头数据容量为MaxSize-1
环形队列生命周期
开始时,rear与front均指向0,这是初始状态。
每把一个数据放入队列,尾指针rear就会+1。
当(rear+1)%MaxSize=front 时,队列满。因为rear指向尾数据的下一个空间,队列满时rear+1自然等于front。
之所以%MaxSize取模是因为:环形队列指针的值会一直增加,%Maxsize会得到周期性的值,就像角度会加到362度、750度一样。
温馨提示:
%运算符:比如2%3就是,2除以3等于0余2,所以2%3就是2,而3%2=1。
每把一个数据从队列中取出,头指针front+1。
当front==rear时,即头指针与尾指针指向同一处,此时队列为空。
重点
这里不再像单队列,在循环中,front与rear的大小关系是不定的,有时rear>front,有时front>rear。
为什么会出现这种情形呢,rear>front的情形好理解,尾与头嘛。至于front>rear的情形,我们类比一下角度,假如rear在361度的位置,front在365度的位置,别忘了是环形。
由此可以得出,环形队列中的元素总数为:(rear-front+MaxSize)%MaxSize,始终用尾减去头,又因为rear-front的值正负不定,所以要加上MaxSize再%MaxSize。
环形队列可循环使用。
遍历时,从front开始,一直到front+size结束,size是当前元素个数,因为元素个数size会随着出队进队变化,变化量与front的移动量是一致的
环形队列数组实现
1 | package Queue; |