队列——顺序队列

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。

本文主要讲的是顺序队列,以及它的相关操作。
建立顺序队列结构必须为其静态分配或动态申请一片连续的存储空间,并设置两个指针进行管理。一个是队头指针front,它指向队头元素;另一个是队尾指针rear,它指向下一个入队元素的存储位置。
置空队:

q->front = 0;
q->rear  = 0;

将队头和队尾指针都置为0,就是一个置空队的过程。
顺序队列有固定的存储空间,所以就会存在着队满的问题,当然,队空的问题也肯定是会存在的。
那如何判断队空呢?很简单,只要队头指针等于队尾指针就行了,即

q->front == q->rear;

满足这一点即为队空。
队满也很简单,即在你的队尾指针后面如果就是队头指针,那队就满了,那队尾指针要是最后一个元素呢?也很简单将它加上1再和队列长度取余,看这个元素是否为队头元素,这种方法即使队尾不是最后一个元素也适用,即:

 q->front == (q->rear+1)%SIZE;

进队操作:

q->rear = (q->rear+1) % SIZE;
q->data[q->rear] = x;

队列的进队都是从队尾进,将队尾指针向后置一,若队尾指针已经到了最后一个元素,则到第一个元素,即加上一并和队列长度取余。数据的赋值就没什么好说的了。

出队操作:

q->front = (q->front+1)%SIZE;
*x = q->data[q->front];

出队操作也很简单,将队头指针向后置一,若是到了最后一个元素,也是到第一个元素,用一个x接下它的值。当然在这之前我们需要判断是否队空。

获取队头元素:

int index = (q->front + 1) % SIZE;
    *x = q->data[index];

获取队头元素在出队操作中可以说也是实现过了,我们这里用一个index,获取队头元素的下标,然后获得数值。

总的来说,操作顺序队列其实就是在操作一个数组相对简单一些,但顺序队列也存在一些不足,比如存在队满的情况。

你可能感兴趣的:(数据结构)