数据结构之队列QUEUE

队列(queue)
队列为限制在两端操作的线性表
允许进行存入操作的一端称为队尾,允许进行删除的一端称为队头;
队头出队,队尾入队
先进先出。
画图
在这里插入图片描述
中间不允许操作,你可以把它想像成一根水管一边进水,一边出水,中间不可以漏水。
队列也可以分为顺序队列和链式队列;
一、顺序队列
顺序队列的实现也是利用front和rear来记录数据位置,并且只有这俩个来记录,所以你访问的时候也就只能访问这俩个位置,即队头和队尾。
画图:
在这里插入图片描述
.h文件
在这里插入图片描述

1)创建(queue_create)
话不多说直接MALLOC加初值
front和rear开始是(-1)不能用-1用0;data用memset初始化赋0;
代码:
在这里插入图片描述
应该写-1的而且memset也要写
memset(起始地址,赋什么值,赋值范围)
在这里插入图片描述
2)入队(enqueue)
入队即rear=rear+1把Vaule给data[rear];
在这里插入图片描述
这里代码和我们写的不一样的原因是,它用到一个循环队列的思想;
循环队列:
你想一下,我一直入队一直入队,满了(rear==N)就不能入队了吧,但是我入队的情况下我出了队,即(front=front+1),可能还不止出了一个,那么如图:
在这里插入图片描述

像这种情况我红色部分就浪费了,浪费内存是可耻的,因此我们利用了一个循环队列的想法;
我们一条一条程序来解读,然后了解循环队列
在这里插入图片描述
if((sq->rear+1)%N=sq->front)
这是一个判断栈是否满的一个语句
%N是什么操作呢
假设我们总空间(N)等于6,那么我要录第7个数而且刚好rear=1,即已经出队了一个元素,那么我第7的元素刚好就可以放下去7%N=1;
图:(妈的,弄反了,rear是入队,front是出队,操)

在这里插入图片描述
这样就可以循环使用空间了,节约资源小天才!
3)出队(de)queue)出队用front来控制
直接上代码:
在这里插入图片描述
和还有什么FREE什么什么操作画图就会;
二、链式队列
链式队列,拥有队列的特性,不过在空间上不连续,
.h文件
在这里插入图片描述
链式队列定义了俩个结构体,并MALLOC了俩个空间:
如图:
在这里插入图片描述
用结构体Link queue来控制linklist
1)创建(queue_create)
老规矩 MALLOC+赋初值
不过我们这里要MALLOC两个,怎么MALLOC的就怎么去FREE;
代码:
在这里插入图片描述
2)队尾入队
在这里插入图片描述
代码:在这里插入图片描述
2)出队
队头出队,这里有一个问题,我们的对头是一个头节点,这就导致我们对头出队,不太行。
方法1:直接删,然后再接起来
在这里插入图片描述
方法2:把头节点直接不要
在这里插入图片描述
直接建议方法二更简单牛逼
上代码:在这里插入图片描述

over~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值