一个队列的入队序列为1234,则序列可能的输出序列是( )。
队列通常可以分为两种类型:
一、顺序队列,采用顺序存储,当长度确定时使用。 顺序队列又有两种情况:
①使用数组存储队列的称为静态顺序队列。
②使用动态分配的指针的称为动态顺序队列。
二、链式队列,采用链式存储,长度不确定时使用(由链表实现)。
由于链式队列跟链表差不多,所以在这里只针对循环(环形)队列来说明并实践。
循环队列的两个参数:
①front,front指向队列的第一个元素。(front==head)
②rear,rear指向队列的最后一个有效元素的下一元素。(rear==tail)
队列的两个基本操作:出队和入队。
下面是一个循环队列(基于数组实现)的结构图:
入队(尾部入队)
①将值存入rear所代表的位置。
②rear = (rear+1)%数组的长度。
出队(头部出队)
front = (front+1)%数组的长度。
队列是否为空
front和rear的值相等,则该队列就一定为空。
队列是否已满
在循环队列中,“队满”和“队空”的条件有可能是相同的,都是front ==rear,这种情况下,无法区别是“队满”还是“队空”。
针对这个问题,有3种可能的处理方法: 【这里采用了第3种处理方法】
从上图可以看出,随着入队、出队的进行,会使整个队列整体向后移动,就会出现上图中的现象:队尾指针已经移到了最后,即队尾出现溢出,无法再进行入队操作,然而实际上,此时队列中还有空闲空间,这种现象称为“假溢出”。
解决“假溢出”的三种办法:
采用了这种头尾相接的循环队列后,入队的队尾指针加1操作及出队的队头指针加1操作必须做相应的修改,以确保下标范围为0~Max_Size-1。对指针进行取模运算,就能使指针到达最大下标位置后回到0,符合“循环”队列的特点。
因此入队时队尾指针加1操作改为: pQueue->tail = (pQueue->tail+1) % MAX_SIZE;
入队时队尾指针加1操作改为: pQueue->head = (pQueue->head+1) % MAX_SIZE;