队列是在一头插入,在另一头删除的线性表。
设顺序存储队列用一维数组q[n]表示,其中n为队列中元素个数,队列中元素在向量中的下标从0到n-1。设队头指针为front,队尾指针是rear,约定front指向队头元素的前一位置,rear指向队尾元素。当front等于-1时队空,rear等于n-1时为队满。由于队列的性质(“删除”在队头而“插入”在队尾),所以当队尾指针rear等于n-1时,若front不等于-1,则队列中仍有空闲单元,所以队列并不是真满。这时若再有入队操作,会造成假“溢出”。
解决办法
将队列元素向前“平移”(占用0至rear-front-1)
将队列看成首尾相连,即循环队列(0..n-1)
在循环队列下,q[n]的队列中元素的个数可能为0,1,2…,n-2,n-1,n共n+1中可能性(0表示队空,n表示队满),但是rear-front(尾指针和头指针下标的差值)的结果只可能是0,1,2…,n-2,n-1共n种结果,因此,没办法使用n中结果去对应n+1中可能性,只能使用一个空的数据位来实现循环队列。
[注:也可以使用flag标记,来区分队满队空]