实现循环队列为什么要使用一个空的数据位
2016-12-07 20:54
302 查看
队列是在一头插入,在另一头删除的线性表。
设顺序存储队列用一维数组q
表示,其中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
的队列中元素的个数可能为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标记,来区分队满队空]
设顺序存储队列用一维数组q
表示,其中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
的队列中元素的个数可能为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标记,来区分队满队空]
相关文章推荐
- 使用顺序表实现一个循环队列
- 如何实现一个循环队列
- Java 有几程方法可以实现一个线程?用什么关键字修饰同步?stop()和suspend()为什么不推荐使用?
- 使用循环数组高效的实现队列类
- 数据结构(C实现)------- 顺序队列(循环队列之少用一个存储空间实现) .
- C++实现的一个循环队列
- 如何实现一个循环队列
- 两个队列实现一个栈(两个队列循环)
- 28. 微软面试题:使用多线程实现一个队列
- 使用两个队列实现一个栈,使用两个栈实现一个队列!
- 013使用两个栈实现一个队列(keep it up)
- 如何实现一个循环队列
- 如何实现一个循环队列
- 使用数组实现栈和循环队列(JAVA语言)
- 循环队列的一个简单实现
- 循环数组实现一个队列
- 如何实现一个循环队列
- 使用两个队列实现一个栈,使用两个栈实现一个队列!
- 这里实现一个基于数组的线程安全的循环队列
- 数据结构循环队列,数组实现,循环队列中如果不使用数据项计数字段items,而是通过front和rear计算队列是否为空或满或队列个数,那会很复杂