队列和循环队列
2017-03-21 20:37
218 查看
1.队列(Queue)
是一种运算受限的线性表。它只允许在表的一端进行插入,而在另一端进行删除。允许删除的一端称为队头(front),允许插入的一端称为队尾(rear)。队列也存在顺序存储结构和链式存储结构
队列具有先进先出原则,与栈的先进后出形成对比。
2.队列的顺序存储结构
为充分利用向量空间,克服"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环队列
什么叫假溢出呢?
为了防止出队时后面全部前移,我们设置一个头指针front(指向队头元素)和尾指针rear(指向队尾元素的下一个位置),当front=rear空队列
当我们将a1 a2出队,在后面再添加元素,rear移动到数组之外
另外随着添加元素会产生数组越界,但是前面还有a1 a2空出的位置,这就叫假溢出。即系统作为队列用的存储区还没有满,但队列却发生了溢出。
如何解决假溢出呢?
后面满了我们可以再从头开始!也就是头尾相接的循环,我们把这种头尾相接的顺序存储结构叫做循环队列。
当队列为空时,front=rear
如何判断队列满呢?
如图,这种情况rear=front,我们不取这种方式
我们可以修改队列满的条件,可以保留一个空间元素,也就是说,队列满时数组中还有一个空闲的单元
如图所示,rear可能比front大,也可能比front小,所以即使位置相近下标也可能差一圈
假设队列的最大尺寸为QueueSize,那么队列满的条件是(rear+1)%QueueSize==front
队列的长度:(rear-front+QueueSize)%QueueSize
3.队列的链式存储结构
其实就是线性表的单链表,只不过它只能尾进头出。简称为链队列。
我们把头指针指向头结点,队尾指针指向终端结点,空队列时,front和rear都指向头结点
入队操作:
即在链表尾部插入结点
出队操作:
头结点的后继结点出队,头结点指向下一个结点
若链表除了头结点只剩一个元素时,需将rear指向头结点
总的来说,在确定队列长度情况下,建议使用循环队列,否则使用链队列
是一种运算受限的线性表。它只允许在表的一端进行插入,而在另一端进行删除。允许删除的一端称为队头(front),允许插入的一端称为队尾(rear)。队列也存在顺序存储结构和链式存储结构
队列具有先进先出原则,与栈的先进后出形成对比。
2.队列的顺序存储结构
为充分利用向量空间,克服"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环队列
什么叫假溢出呢?
为了防止出队时后面全部前移,我们设置一个头指针front(指向队头元素)和尾指针rear(指向队尾元素的下一个位置),当front=rear空队列
当我们将a1 a2出队,在后面再添加元素,rear移动到数组之外
另外随着添加元素会产生数组越界,但是前面还有a1 a2空出的位置,这就叫假溢出。即系统作为队列用的存储区还没有满,但队列却发生了溢出。
如何解决假溢出呢?
后面满了我们可以再从头开始!也就是头尾相接的循环,我们把这种头尾相接的顺序存储结构叫做循环队列。
当队列为空时,front=rear
如何判断队列满呢?
如图,这种情况rear=front,我们不取这种方式
我们可以修改队列满的条件,可以保留一个空间元素,也就是说,队列满时数组中还有一个空闲的单元
如图所示,rear可能比front大,也可能比front小,所以即使位置相近下标也可能差一圈
假设队列的最大尺寸为QueueSize,那么队列满的条件是(rear+1)%QueueSize==front
队列的长度:(rear-front+QueueSize)%QueueSize
3.队列的链式存储结构
其实就是线性表的单链表,只不过它只能尾进头出。简称为链队列。
我们把头指针指向头结点,队尾指针指向终端结点,空队列时,front和rear都指向头结点
入队操作:
即在链表尾部插入结点
出队操作:
头结点的后继结点出队,头结点指向下一个结点
若链表除了头结点只剩一个元素时,需将rear指向头结点
总的来说,在确定队列长度情况下,建议使用循环队列,否则使用链队列