【无标题】队列详解【易忘】


队列是什么?
想象一下你在银行排队,你只能从队尾加入,然后从队头离开。队列就是这样一种东西,它有两头,一头是进的(队尾),一头是出的(队头)。
队列的基本操作
初始化:就像你刚到银行,队列还没开始排队,你需要先建立一个队列。
判断队列是否为空:看看队列里有没有人在排队。
入队:就像你加入队尾,等待办理业务。
出队:就像你办完业务,从队头离开。
读取队头元素:看看队头的那个人是谁,但不用把他拉出来。
队列的存储方式
想象一下队列是一个有固定位置的座位,我们用两个手指(指针)来指示队头和队尾的位置。
初始状态:队列是空的,两个手指都指向第一个座位。
进队操作:如果队列没满,你就坐在队尾的座位上,然后队尾的手指就挪到下一个座位。
出队操作:如果队列里有人,你就从队头的座位站起来,然后队头的手指也挪到下一个座位。
假溢出是个什么鬼?
这就像是你看到座位都满了,但其实还有一个空位,只是因为队尾的手指已经绕到了队头的后面。
循环队列
想象一下队列是一个圆形的座位,你可以绕一圈再坐回来。
基本操作:如果队尾的手指到了最后一个座位,它就会跳回到第一个座位,形成一个圈。
队列长度:就是队尾的手指比队头的手指多绕了几圈。
队空判断:如果两个手指指向同一个座位,那队列就是空的。
队满判断:如果队尾的手指再往前一格就是队头的手指,那队列就是满的。
队列中的计数器
就像你在排队时数数前面有多少人一样,队列里也有一个计数器来告诉你队列里有多少元素。
队空条件:计数器显示为0,说明没人在排队。
队满条件:计数器显示最大值,说明座位都满了。
特殊标记(tag)
就像你用不同的手势来表示队列是空的还是满的一样,队列里也有一个特殊的标记来区分这两种情况。

队列的链式存储
想象一下,你有一个长长的队伍,每个人都是队伍的一部分,而且每个人都知道下一个是谁。在队列的链式存储中,每个“人”(也就是数据元素)都是一个节点,他们通过指针(也就是手)指向下一个“人”。这样,无论你的队伍有多长,都不会有溢出的问题,因为每个人都知道下一个是谁,队伍可以无限延伸。
队头:就是队伍最前面的那个人,他总是第一个被处理。
队尾:就是队伍最后面的那个人,新来的人总是站在他后面。
空队列:如果队头和队尾都找不到人,那就意味着队伍是空的。
优点
灵活:链式队列就像是一个弹性的绳子,可以根据需要变长或变短,不会像固定长度的绳子那样限制你。
无溢出:因为队伍可以无限延伸,所以不用担心队列满了不能再加人。
适合变化:如果你的队伍人数经常变化,链式队列是一个很好的选择,因为它可以很容易地适应这种变化。
双端队列
双端队列就像是一个两端都可以进出的队伍。你可以在队伍的一头加入新人,也可以在另一头让旧人离开,或者反过来也行。
输出受限:这种队伍的一头可以让人进出,但另一头只能让人进来,不能让人出去。
输入受限:和输出受限相反,这种队伍的一头可以让人进出,但另一头只能让人出去,不能让人进来。
双端队列的好处是,它给你更多的选择,你可以根据需要选择在哪头操作。
 

知识点链接

队列(Queue)是一种特殊的数据结构,它遵循先进先出(FIFO,First In First Out)的原则。
队列的基本概念
队列:是一种线性表,但与数组或链表不同,队列的操作有严格的限制,只能在一端插入元素(称为队尾),在另一端删除元素(称为队头)。
队列的结构
队头(Front):用于删除元素的一端。
队尾(Rear):用于插入元素的一端。
空队列:没有任何元素的队列。
队列的基本操作
InitQueue(&Q):初始化一个空队列Q。
QueueEmpty(Q):判断队列是否为空,如果为空返回true,否则返回false。
EnQueue(&Q, x):入队操作,如果队列未满,将元素x加入队尾。
DeQueue(&Q, &x):出队操作,如果队列非空,删除队头元素,并将该元素的值赋给x。
GetHead(Q, &x):读取队头元素,如果队列非空,将队头元素的值赋给x。
队列的顺序存储结构
概念:使用一块连续的存储单元来存放队列中的元素,并使用两个指针,队头指针front和队尾指针rear。
基本操作
初始状态:队列为空时,front和rear的值都为0。
进队操作:队列未满时,先将值存入队尾元素,然后将队尾指针加1。
出队操作:队列非空时,先读取队头元素的值,然后将队头指针加1。
假溢出
假溢出指的是当队列的指针移动到数组的末尾时,虽然数组中还有空间,但队列已经被认为是满的。
循环队列
概念:逻辑上将存储队列元素的数组视为一个环形结构。
基本操作
初始状态:front和rear的初始值都为0。
队首指针进1: Q.front = (Q.front + 1) % MaxSize 。
队尾指针进1: Q.rear = (Q.rear + 1) % MaxSize 。
队列长度: (Q.rear + MaxSize - Q.front) % MaxSize 。
队空判断: Q.front == Q.rear 。
队满判断:牺牲一个单元来区分队空和队满, (Q.rear + 1) % MaxSize == Q.front 。
类型中的数据成员
元素个数:增设数据成员来表示队列中的元素个数。
队空条件: Q.size == 0 。
队满条件: Q.size == MaxSize 。
tag数据成员:用来区分队空和队满,tag等于0时表示队空,tag等于1时表示队满。


队列的链式存储结构
队列是一种数据结构,它遵循先进先出(FIFO)的原则。在队列的链式存储结构中,数据元素不是存储在连续的内存空间中,而是通过指针连接的一系列节点。这种结构具有以下特点:
队头指针(Front):指向队列的第一个元素,即最先被处理的元素。
队尾指针(Rear):指向队列的最后一个元素,即最新添加的元素。
空队列:当队头指针和队尾指针都为NULL时,表示队列为空。
优点
动态存储:链式队列不需要预先分配固定大小的内存空间,因此可以动态地根据数据元素的数量调整存储空间。
无溢出问题:由于内存空间是动态分配的,因此不会出现因队列满而无法添加新元素的情况。
适合数据元素变动大的情况:当数据元素数量变化较大时,链式队列可以灵活地进行扩展或收缩。
双端队列
双端队列是一种特殊的队列,它允许在队列的两端进行入队和出队操作。这种队列的逻辑结构仍然是线性的,但根据操作的限制,可以分为以下两种类型:
输出受限的双端队列:这种队列允许在一端进行插入(入队)和删除(出队)操作,但在另一端只允许插入操作。
输入受限的双端队列:与输出受限的双端队列相反,这种队列允许在一端进行插入和删除操作,但在另一端只允许删除操作。
双端队列提供了更多的灵活性,可以根据不同的应用场景选择适合的操作方式。
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值