队列——链队列和顺序循环队列

一、队列的定义:

1.队列是只允许队头进行删除,队尾进行插入的数据结构

2.入队:从队尾向队列中插入元素的操作。

3.出队:从队头向队列中插入元素的操作。

4.特点:先进先出,是特殊的线性表。

二、链队列结构:

1.在进行链队列的操作之前,先确定是否需要头结点,本处采用没有头结点的情况。

2.链队列:定义结点结构体时,首先在结构体中定义一个数据域data,和一个指向下一个结点的指针next;

2c4a95423a7949b8a9b800805e623c3b.jpg

 3.接着定义两个指针分别为队头指针(front)和队尾指针(reat)

39b2d8c131574f7f9000edf63ff45844.jpg

 三、链队列的操作:

1.初始化操作:在主函数中定义链队列Q,并为其申请内存空间,在没有头结点的情况下,其Q==NULL。在进行初始化的函数中,将Q->front==NULL, 两个头尾指针都指向空,但是存在头结点的情况下则要特殊讨论,具体讨论可以看完主页上的《有无头结点的文章》。

ac9a9ab188a54e62a6eabe4b8887ef91.jpg

 2.入队列操作:首先定义的一个新的结点,并为其申请内存空间,接着我们要讨论其是否是链表的第一个结点,如果是第一个结点的情况,则将新结点的数据域赋值后,其新结点的指针域赋值为空,接着将队头指针指向该新结点的情况,接着将队尾指针指向该新结点的情况。如果不是第一个结点的话,首先也要申请内存空间,再然后将新结点的指针域指向空,然后将前一个队尾指针指向的元素,将其指针域指向新结点,然后不要再移动队头指针,只需移动队尾指针指向新结点。

15c7e2bbbc7e40f5ac82888ed975fb62.jpg

aab482c11b104ef5bd74fdc3f9c95dcf.jpg 

 8099db541dda42718b7324e16f5d0f1d.jpg

 0255a31fdf0342b7823657f89fe20647.jpg

 3.出队列操作:当所出元素不是最后一个结点时为以下操作,首先先定义一个工作指针,将队头元素赋值给当前的工作指针。接着将其队头结点的元素域带回,再将队头指针指向工作指针的下一个。接着再将工作指针内存释放即可。倘若是最后一个结点,则其队尾指针和队头指针都要指向空。

bbf15f89e80b45659e91887be4297f09.png

 四、顺序循环队列的操作:

1.什么是循环队列:循环的队列是从顺序队列上面衍生出来的一种结构,是为了避免移动元素而浪费大量的时间。

2.顺序循环队列的结构定义:定义此结构有队头指针(并不是真正的指针变量)和队尾指针。还有一个数据域。因为此结构为循环队列,在真正的操作中入队列和出队列都是随机的,只要内存空间能存放就可以插入。但是因为front队头指针是指向当前的元素,而队尾指针是指向最后一个元素的下一位的存储位置。

b0e71b6575fd4b7da65f207fd8abc0ce.jpg

 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时,就是一个空的循环队列;

9c7af9a3da1e4363baec9d9d4dd4ce73.jpg

 5.当q->front==q->reat时也是队列满的情况;

497f20a5f3b649728b09c504bdefb890.jpg

 6.在这里我们采用上面的留一个内存空间,这样只要满足以下条件(p->rear+1)%MAXSIZE==p->front;此时循环队列为满队列;

9a2daffb2c29413cb8e2ceef95f8f057.jpg

 7.入队列操作:在代码书写中,我们首先要考虑此栈是否满了,倘若满了,则不再进行入队,倘若没有满则可以继续入队列。而其判断条件为(p->rear+1)%MAXSIZE==p->front;倘若没有,我们则进行入队列

efe74d6823214add915d8612e9bc05b3.jpg

 8.最后相关操作看以下代码;

c9fbf6ef40e548b1a7493a87215ccedf.jpg

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值