队列的入队和出队操作

本文介绍了队列的基本概念,以顺序队列为例,阐述了队列的入队和出队操作。入队时,元素在队尾插入,rear指针增加;出队时,队头元素被删除,front指针前进。队列的长度通过front和rear的关系计算得出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开发工具与关键技术:Visual Studio 2015
作者:杨灵武
撰写时间:2020/05/27

让我们跟着课程队列的特点。好比我们生活中也会发生的排队,
先排队的人先得到服务,先走出队列,后面来的人后得到服务,所以它排在末尾
在这里插入图片描述
我们以顺序队列为式,也就是说队列的元素存放的都是连续的单元也就是说看起来rear 指
针已经指向末端但是其实前面还有空间可以存放元素,但是已经放不进去了。我们让front
和rear都等于0 就使得我们的循环队列front和rear在空的时候等于0,然后我们判断队列
是否为空 它的条件就是front和rear是否相等这就是在求我们的队列实际元素的个数,也
就是队列的长度 算出它的实际大小需要把rear减去front
我们的重点讲解队列入队和出队操作
在这里插入图片描述
我们的队列只允许队尾操作的时候是插入的过程是队尾的指示器增加,这时候rear增加一
位 这是在队尾插入而队头是不需要修改的,
在这里插入图片描述
出队的时候是删除操作 把前面已经放到队列的先取出来,然后我们需要一个备份 不然就
找不回来了 因为它不存在队列中了 删除操作只能是队头 所以是front改了

### 关于队列入队出队操作的图解示例 #### 队列的基本概念 队列是一种遵循先进先出(FIFO, First In First Out)原则的数据结构。这意味着最早进入队列的元素会最先被移除[^1]。 #### 队列操作 队列的主要操作包括 **入队 (Enqueue)** **出队 (Dequeue)**: - **入队** 是指将新元素添加到队列的尾部。 - **出队** 是指从队列头部删除一个元素并返回该元素。 以下是基于顺序存储链式存储两种方式下的队列入队出队的具体图解说明: --- #### 一、顺序存储队列入队出队操作 ##### 初始状态 假设有一个固定大小为5的数组表示队列,初始状态下 `front` `rear` 指针均指向0位置,此时队列为空。 ``` |---|---|---|---|---| | | | | | | front=rear=0 ``` ##### 入队操作 当执行入队操作时,新的元素会被放置在 `rear` 的下一个位置,并更新 `rear` 指针的位置。 例如,依次加入元素 A、B、C 后的状态如下所示: ``` | A | B | C | | | rear front ``` 注意:如果 `rear` 达到最后一位,则需要考虑循环队列的情况来处理边界条件。 ##### 出队操作 当执行出队操作时,位于 `front` 处的元素被取出并移除,随后 `front` 指针向前移动一位。 例如,在上述基础上连续两次出队后的状态如下所示: 第一次出队后: ``` | | B | C | | | front rear ``` 第二次出队后: ``` | | | C | | | front=rear ``` --- #### 二、链式存储队列入队出队操作 对于链式存储的队列,其节点由两部分组成:数据域 (`data`) 指针域 (`next`)。通过动态分配内存的方式管理队列中的元素。 ##### 初始状态 初始化时创建头结点作为标志位,实际有效数据存放在后续链接起来的各个节点之中。设当前仅有头结点存在,即为空队列。 ```cpp Head -> null ``` ##### 入队操作 每次新增加一个节点至队尾处完成插入动作即可。具体过程见下述伪代码片段以及对应图形展示。 ```cpp void EnQueue(LinkQueue &Q, int e){ Qptr s = new QNode; s->data = e; s->next = nullptr; Q.rear->next = s; // 将s连接到原队尾之后 Q.rear = s; // 更新队尾指针 } ``` 假定已有的队列为 {A,B} ,现在要再追加上去 D 这样就形成了下面的样子: ``` Head -> A -> B -> D -> NULL Front Rear ``` ##### 出队操作 同样地,只需改变前驱节点所指向的内容便可轻松达成目标效果。下面是相应逻辑描述及其可视化表现形式。 ```cpp int DeQueue(LinkQueue &Q){ if(Q.front == Q.rear) throw "Empty Queue"; Qptr p = Q.front->next; int value = p->data; Q.front->next = p->next; delete p; if(!Q.front->next) Q.rear = Q.front; return value; } ``` 假如我们对上面那个包含三个字母字符组成的队伍施行一次弹射行为的话那么最终得到的结果应当呈现如此这般模样出来啦! ``` Head -> B -> D -> NULL Front Rear ``` 以上便是有关采用单向列表构建而成之排队体系里边涉及到的一些基础知识点介绍完毕咯😊~[^4] --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值