![数据结构(C语言实现)](https://wfqqreader-1252317822.image.myqcloud.com/cover/699/43806699/b_43806699.jpg)
3.4.4 顺序循环队列
为了避免顺序队列的“假溢出”,通常采用顺序循环队列实现队列的顺序存储。
1.顺序循环队列的构造
为了充分利用存储空间,消除这种“假溢出”,当队尾指针rear(或队头指针front)到达存储空间的最大值QueueSize的时候,让队尾指针rear(或队头指针front)自动转换为存储空间的最小值0。这样,顺序队列的存储空间就构成一个逻辑上首尾相连的循环队列。
当队尾指针rear达到最大值QueueSize-1时,如果要插入新的元素,队尾指针rear自动变为0;当队头指针front达到最大值QueueSize-1时,如果要删除一个元素,队头指针front自动变为0。可通过取余操作实现循环队列的首位相连。例如,若QueueSize=10,当队尾指针rear=9时,如果要插入一个新的元素,则有rear=(rear+1)%10=0,即实现了逻辑上队列的首尾相连。
2.顺序循环队列的队空和队满
顺序循环队列在队空状态和队满状态时,队头指针front和队尾指针rear同时都指向同一个位置,即front==rear,顺序循环队列的队空状态和队满状态如图3.28所示。队列为空时,有front=0,rear=0,因此front==rear。队满时也有front=0,rear=0,因此front==rear。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/95_01.jpg?sign=1739465383-PRo9NtEyUD4ZWz1h3OjnqT6bpvMssPLA-0-489628918753feef2e7d2e2e246ac8b5)
图3.28 队空和队满状态
因此,为了区分这两种情况,通常有两个办法:
(1)增加一个标志位。设这个标志位为flag,初始化为flag=0,当入队成功,有flag=1,出队列成功,有flag=0,则队列为空的判断条件为:front==rear&&flag==0,队列满的判断条件为:front==rear&&flag==1。
(2)少用一个存储空间。队空的判断条件不变,以队尾指针rear加1等于front为队满的判断条件。因此front==rear表示队列为空,front==(rear+1)%QueueSize表示队满。那么,入队的操作语句为:rear=(rear+1)%QueueSize,Q[rear]=x。出队的操作语句为:front=(front+1)%QueueSize。少用一个存储空间时,队满情况如图5.10所示。
注意:顺序循环队列中的入队操作和出队操作,都要取模,以确保操作不出界。循环队列长度即元素个数为(SQ.rear+QueueSize-SQ.front)%QueueSize。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/95_02.jpg?sign=1739465383-oExiEkVkjHzmkSe85vb6rezSVullbUwn-0-e067b531c059a01262d5611bac468317)
图3.29 顺序循环队列队满情况
3.顺序循环队列的实现
(1)初始化。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/95_03.jpg?sign=1739465383-YOmBe4OYUbZ3xEpZ2xQLMlUOrMdnB5xC-0-0a799222fe54cc039f3bee4e9ae7a036)
(2)判断队列是否为空。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/95_04.jpg?sign=1739465383-c55JTw1RC8KXeDeKFNyvyNa2FkCiDrB9-0-7a6134306baef8f92b0bbfe969f610b8)
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/96_01.jpg?sign=1739465383-wTrwMHTzjkVqmJyEBSPeecgpkuitrZlY-0-c817d0755b228e59073043e0f8ca55b5)
(3)入队操作。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/96_02.jpg?sign=1739465383-EAGAg4qm2xAvToJZNySRUg1PfVgFxT65-0-ef1737275fdeb32f32a3d02437083026)
(4)出队操作。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/96_03.jpg?sign=1739465383-eHWmOnh6gqbHyiie175r8MfzwivpEnvp-0-4ccd5344a9ede2adba6f55e8de1e63e8)
(5)取队头元素。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/96_04.jpg?sign=1739465383-vnwEsH1orq7Z5y4R1YiCO6A9CphqcT3k-0-1aa4bca5b8e437ab79f83fc956c7cfe2)
(6)清空队列。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/96_05.jpg?sign=1739465383-RQQp7HZEAvmN0lY5AdCe0HI8ILQKMeGy-0-f3998f8a6036c1dd9c06bfd65ee90bf0)
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/97_01.jpg?sign=1739465383-jWVjvVHNFoSCD68JJqn5WYVMuskFaekF-0-633f2ced0d1674b2b37e8a17c22ca17a)