一、队列的定义:
1.队列是只允许队头进行删除,队尾进行插入的数据结构
2.入队:从队尾向队列中插入元素的操作。
3.出队:从队头向队列中插入元素的操作。
4.特点:先进先出,是特殊的线性表。
二、链队列结构:
1.在进行链队列的操作之前,先确定是否需要头结点,本处采用没有头结点的情况。
2.链队列:定义结点结构体时,首先在结构体中定义一个数据域data,和一个指向下一个结点的指针next;
3.接着定义两个指针分别为队头指针(front)和队尾指针(reat)
三、链队列的操作:
1.初始化操作:在主函数中定义链队列Q,并为其申请内存空间,在没有头结点的情况下,其Q==NULL。在进行初始化的函数中,将Q->front==NULL, 两个头尾指针都指向空,但是存在头结点的情况下则要特殊讨论,具体讨论可以看完主页上的《有无头结点的文章》。
2.入队列操作:首先定义的一个新的结点,并为其申请内存空间,接着我们要讨论其是否是链表的第一个结点,如果是第一个结点的情况,则将新结点的数据域赋值后,其新结点的指针域赋值为空,接着将队头指针指向该新结点的情况,接着将队尾指针指向该新结点的情况。如果不是第一个结点的话,首先也要申请内存空间,再然后将新结点的指针域指向空,然后将前一个队尾指针指向的元素,将其指针域指向新结点,然后不要再移动队头指针,只需移动队尾指针指向新结点。
3.出队列操作:当所出元素不是最后一个结点时为以下操作,首先先定义一个工作指针,将队头元素赋值给当前的工作指针。接着将其队头结点的元素域带回,再将队头指针指向工作指针的下一个。接着再将工作指针内存释放即可。倘若是最后一个结点,则其队尾指针和队头指针都要指向空。
四、顺序循环队列的操作:
1.什么是循环队列:循环的队列是从顺序队列上面衍生出来的一种结构,是为了避免移动元素而浪费大量的时间。
2.顺序循环队列的结构定义:定义此结构有队头指针(并不是真正的指针变量)和队尾指针。还有一个数据域。因为此结构为循环队列,在真正的操作中入队列和出队列都是随机的,只要内存空间能存放就可以插入。但是因为front队头指针是指向当前的元素,而队尾指针是指向最后一个元素的下一位的存储位置。
3.设立相关条件,判断队列满还是空:
1)另外设一个标志以区分队空、队满。
队空:q->front == q->rear成立,且flag = 0;
队满:q->front == q->rear成立,且flag = 1;
2)少用一个元素空间:
队空:q->front == q->rear ;
队满:(q->rear+1)%MAXSIZE==q->front;
3)设一个存储队列元素个数的变量;
4.当q->front==q->reat时,就是一个空的循环队列;
5.当q->front==q->reat时也是队列满的情况;
6.在这里我们采用上面的留一个内存空间,这样只要满足以下条件(p->rear+1)%MAXSIZE==p->front;此时循环队列为满队列;
7.入队列操作:在代码书写中,我们首先要考虑此栈是否满了,倘若满了,则不再进行入队,倘若没有满则可以继续入队列。而其判断条件为(p->rear+1)%MAXSIZE==p->front;倘若没有,我们则进行入队列
8.最后相关操作看以下代码;