循环队列是一种特殊的队列,它的特点是队首和队尾可以重合,因此可以节省空间。在循环队列中,我们通常使用两个指针front和rear来分别表示队首和队尾,同时还有一个MAXSIZE来表示队列的最大长度。当队列为空时,队首和队尾重合,即Q.front == Q.rear;当队列满时,队首和队尾相差1个元素,即Q.front == (Q.rear + 1) % MAXSIZE。这种设计的好处是可以避免数组越界的问题。
循环队列一般都是指定长度的容器,因为没有指定长度,就无法实现循环队列的功能。通常情况下,我们通过判断当前新元素插入下标和长度的关系来认定队满和队空。
在循环队列中,由于入队时尾指针向前追赶头指针,出队时头指针向前追赶尾指针,造成队空和队满时头尾指针均相等。因此,我们不能通过条件front==rear来判断队列是空还是满。如果要判断一个循环队列Q为空的条件,需要使用Q.front == Q.rear;
区分循环队列的满与空,只有两种方法:一是牺牲一个存储单元,即当队列为空时,将rear指向队列的开头;二是设标记,即在队列的末尾插入一个特殊的标记,当队列为空时,队尾指向这个标记。这种方法可以充分利用向量空间,克服假溢出现象。