![数据结构(C语言实现)](https://wfqqreader-1252317822.image.myqcloud.com/cover/699/43806699/b_43806699.jpg)
3.4.3 顺序队列
队列有两种存储表示:顺序存储和链式存储。采用顺序存储结构的队列称为顺序队列,采用链式存储结构的队列称为链式队列。
1.顺序队列的表示与实现
顺序队列通常采用一维数组作为存储结构。同时,用两个指针分别指向数组中第一个元素和最后一个元素。其中,指向第一个元素的指针称为队头指针(front),指向最后一个元素的指针称为队尾指针(rear)。队列的表示如图3.22所示。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/92_01.jpg?sign=1739296765-4jEUQtLKluUTAMSDIuBIUCxRPgIIgt4w-0-e99b4dccd1879035ce2457bdd8bec243)
图3.22 顺序队列
为了方便描述,我们约定:初始化时,队列为空,有front=rear=0,队头指针front和队尾指针rear都指向队列的第一个位置,如图3.23所示。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/92_02.jpg?sign=1739296765-526iytYl8KL3dLr7wFWV1KExwsL3Sk0N-0-08f8d8ef4944bd9cf2e27dff71d114b5)
图3.23 初始化时,顺序队列为空的情况
插入新元素时,队尾指针rear增1,在空队列中插入4个元素a,b,c,d之后,如图3.24所示。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/93_01.jpg?sign=1739296765-hEdkSH55fHmE6tbGdmQgyqrpzcV8zt7Q-0-aa2bdb68622ccd7818954a60ab741fc1)
图3.24 顺序队列插入4个元素之后的情况
删除元素时,队头指针front增1。删除2个元素a,b之后,队头和队尾指针状态如图3.25所示。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/93_02.jpg?sign=1739296765-NcFYnxn8zxRS0JSovFQ4wV28j2nYASEc-0-deb589f11681fe249a297d9978ab488f)
图3.25 顺序队列删除2个元素之后的情况
顺序队列的类型描述如下:
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/93_03.jpg?sign=1739296765-o9NB9Zz7FyUVboj0tDffZs5Qa9qF6AG5-0-02cb38f2119334ad43181769d76f3592)
假设Q是一个队列,若不考虑队满,则入队操作语句为Q.queue[rear++]=x;若不考虑队空,则出队操作语句为x=Q.queue[front++]。
说明:在队列中,队满指的是元素占据了队列中的所有存储空间,没有空闲的存储空间可以插入元素。队空指的是队列中没有一个元素,也称为空队列。
下面是顺序队列的实现算法(以下顺序队列的实现算法在“SeqQueue.h”文件中)。
(1)队列的初始化。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/93_04.jpg?sign=1739296765-egWYTstDhiit2gO66srY2Xxcha7cdmO7-0-9ec2b9637745ca2fd4926bb075e14c6f)
(2)判断队列是否为空。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/93_05.jpg?sign=1739296765-eInTsPwW24HtD4ASmM2ObylOzuDv1KF5-0-2ff67bbfe2f46f01e23779c37d694fe1)
(3)入队操作。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/93_06.jpg?sign=1739296765-SoKskyJY4mzTWya4Lu7RJh3bJnN14Rg1-0-24775a71d3aaa37fc134d95a8b831d61)
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/94_01.jpg?sign=1739296765-kgM0wsgpdoHG6quRScBeKOUjvSkqSkkN-0-4f7c8727263c31f9ed487e03f461286f)
(4)出队操作。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/94_02.jpg?sign=1739296765-j0j7EdlUxJqJs7gTLUuqyw3hwsZprtaH-0-027b5a40981fdebee55a0e30170949da)
2.顺序队列的“假溢出”
如果在图3.26所示的队列中插入3个元素j,k和l,然后删除2个元素a,b之后,就会出现如图3.27所示的情况,即队尾指针已经到达数组的末尾,如果继续插入元素m,队尾指针将越出数组的下界而造成“溢出”。从图3.27可以看出,这种“溢出”不是因为存储空间不够,而是经过多次插入和删除操作产生的,将这种“溢出”称为“假溢出”。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/94_03.jpg?sign=1739296765-s6b4BTFoGGYn2EyvMvCuv7fgNnjbBfcH-0-75447e47d3150ee6b01c90f6512d5a16)
图3.26 在插入元素j,k,l和删除元素a,b前
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/94_04.jpg?sign=1739296765-yrcYvqT6nARSslql5oyFVkBclj6zDOqQ-0-27e532b45e2527c46cd785d9fc0f10d5)
图3.27 在顺序队列中插入j,k,l和删除a,b后的“假溢出”