当前位置: 首页 > news >正文

【数据结构】队列:定义、顺序队列与链式队列

考点频率:★★★★★(数据结构必考,选择题常考循环队列的判空/判满条件)
难度:⭐⭐⭐
建议:重点理解队列的FIFO特性,掌握循环队列中frontrear指针的含义,以及判空、判满的条件判断

1️⃣ 什么是队列?

队列(Queue)是一种操作受限的线性表。它的核心特征是:只允许在表的一端进行插入,在另一端进行删除

  • 队尾(Rear):允许插入的一端
  • 队头(Front):允许删除的一端

核心特性先进先出(FIFO,First In First Out)——最先进入队列的元素,最先被移出。

打个比方:队列就像食堂打饭的排队。新来的人站在队伍末尾(入队),队伍最前面的人打完饭离开(出队)。先来的人先打饭,后来的人后打饭——这就是FIFO。

队列在计算机系统里非常常见:CPU的进程调度、打印机任务队列、键盘缓冲区……都是队列的应用。

2️⃣ 队列的基本操作

操作含义时间复杂度
入队(Enqueue)将元素插入到队尾O(1)O(1)O(1)
出队(Dequeue)移除队头元素并返回O(1)O(1)O(1)
取队头(Front / Peek)查看队头元素但不移除O(1)O(1)O(1)
判空(IsEmpty)检查队列是否为空O(1)O(1)O(1)
判满(IsFull)检查队列是否已满(顺序队列)O(1)O(1)O(1)

3️⃣ 顺序队列(数组实现)

3.1 普通顺序队列的“假溢出”问题

用数组实现队列时,我们使用两个指针:

  • front:指向队头元素
  • rear:指向队尾元素的下一个位置
#defineMAXSIZE100typedefstruct{intdata[MAXSIZE];intfront;// 队头指针intrear;// 队尾指针(指向下一个空闲位置)}SeqQueue;

入队操作data[rear] = 元素; rear++
出队操作元素 = data[front]; front++

问题:随着入队和出队的进行,frontrear都在不断向后移动。当rear == MAXSIZE时,即使数组前面还有空闲位置(因为出队释放了空间),也无法再入队了。这就是假溢出

3.2 循环队列(解决假溢出)

核心思想:把数组想象成一个首尾相连的环。当rear到达数组末尾时,下一步就绕回到数组开头。

关键约定(软考必考):

约定项说明
front指向队头元素的位置
rear指向队尾元素的下一个位置
判空front == rear
判满(rear + 1) % MAXSIZE == front
元素个数(rear - front + MAXSIZE) % MAXSIZE

⚠️注意:循环队列中,为了区分“空”和“满”,我们牺牲一个存储单元——当(rear+1) % MAXSIZE == front时判满,此时实际上还有一个空位没有放数据。

入队操作

if((rear+1)%MAXSIZE==front){// 队列已满,报错}data[rear]=元素;rear=(rear+1)%MAXSIZE;

出队操作

if(front==rear){// 队列为空,报错}元素=data[front];front=(front+1)%MAXSIZE;

为什么牺牲一个空间?
因为我们无法区分front == rear到底代表“队列为空”还是“队列为满”。如果不牺牲这个空间,两种状态的条件就会完全一样。牺牲一个空间后,“满”的条件变成了(rear+1)%MAXSIZE == front,和“空”的条件front == rear区分开了。

4️⃣ 链式队列(链表实现)

4.1 核心结构

链式队列用单链表实现,队头是链表的头节点,队尾是链表的尾节点。

// 队列节点typedefstructQNode{intdata;structQNode*next;}QNode;// 链式队列(记录队头和队尾指针)typedefstruct{QNode*front;// 队头指针QNode*rear;// 队尾指针}LinkQueue;

4.2 基本操作

入队(在队尾插入新节点):

QNode*newNode=(QNode*)malloc(sizeof(QNode));newNode->data=元素;newNode->next=NULL;if(rear==NULL){// 队列为空front=rear=newNode;}else{rear->next=newNode;rear=newNode;}

出队(移除队头节点):

if(front==NULL){// 队列为空}QNode*temp=front;元素=temp->data;front=front->next;if(front==NULL){rear=NULL;// 队列变空}free(temp);

4.3 链式队列的优缺点

优点缺点
容量动态增长,无假溢出问题每个节点需要额外的指针空间
不需要预先分配连续空间存储密度低

5️⃣ 循环队列 vs 链式队列(对比表)

对比项循环队列(顺序)链式队列
底层结构数组单链表
容量固定(需预先分配)动态增长
假溢出问题通过循环解决不存在
判空条件front == rearfront == NULL
判满条件(rear+1) % MAXSIZE == front无(受内存限制)
存储密度
适用场景元素个数可预知元素个数不可预知

6️⃣ 经典例题

例题1(循环队列判空判满):某循环队列的数组大小为 6,front = 2rear = 5,则队列中的元素个数为( )。

A. 2
B. 3
C. 4
D. 5

解析:元素个数 =(rear - front + MAXSIZE) % MAXSIZE = (5 - 2 + 6) % 6 = 9 % 6 = 3。选B


例题2(循环队列判满):某循环队列的数组大小为 8,若front = 3,则rear为多少时表示队列已满?

A. 2
B. 3
C. 4
D. 6

解析:判满条件为(rear + 1) % 8 == front,即(rear + 1) % 8 == 3rear = 2。选A


例题3(判断):链式队列不存在“假溢出”问题,因为它的存储空间是动态分配的。( )

解析:正确。

7️⃣ 记忆口诀

队列先进先出,队尾入队头出。
循环队列看指针,判空判满要分清。
front == rear为空,(rear+1)%max == front为满。
元素个数公式记:(rear-front+max)%max

8️⃣ 小测验(评论区对答案)

某循环队列的数组大小为 10,front = 7rear = 2,则队列中的元素个数为( )。
A. 3
B. 4
C. 5
D. 6

🔔本专栏日更,点击头像 → 专栏《软考中级高频考点》订阅,第一时间接收新内容

#软考中级 #软件设计师 #队列 #循环队列 #链式队列 #数据结构 #软考备考

http://www.jsqmd.com/news/1371368/

相关文章:

  • 新中式实木线条怎么选?定制、避坑、选购全指南 - 国麟测评
  • 3分钟搞定音乐加密文件!Unlock Music Electron桌面版终极指南
  • 家电维修新品牌怎么立信:德英威新公司、老团队的信任翻转 - 上善若水2026
  • Python进阶指南:从基础语法到项目实战
  • 2026年抗风卷帘门生产厂家怎么选?这份甄选指南请收好 - geo交流
  • Java枚举类详解:从基础到高级应用
  • 如何在3分钟内掌握ppInk:Windows屏幕标注工具的终极免费方案
  • ComfyUI工作流优化:Cyber Inductance项目部署与性能调优指南
  • AI编程工具下的效率困局:从出码率陷阱到端到端效能提升
  • 百度云内容审核API工具类封装实战:从配置到熔断的完整解决方案
  • 嵊州市瓷砖空鼓维修上门推荐_2026浙东沿海避坑指南与大全_卫生间厨房阳台客厅墙砖地砖 - 雨婺虹修缮
  • VMware与火绒兼容性冲突:从原理到实战的完整排错指南
  • OpenClaw智能代理系统在阿里云上的部署与优化
  • AI矩阵获客实战案例大揭秘!
  • 2026年润滑油三级过滤漏斗直销工厂选哪家?这份甄选指南助您择优采购 - geo交流
  • 2026 杭州公司注册服务怎么选?口碑财税机构客观盘点 - 同梦
  • 即时零售缺货时怎么处理?替代商品、补差价和退款要按订单阶段定
  • 数据结构与算法:前缀、中缀、后缀表达式原理与栈实现
  • 科研文献管理方法论体系构建与实践应用路径探析
  • AI Agent开发范式之争:任务级工具与轨迹级方法论的深度解析
  • 电磁感应综合题解析:多区域磁场与双电容的动量定理应用
  • 安全触边系统在工业设备运行中的安全保障与应用分析
  • Claude 「This organization has been disabled.」申诉流程
  • 单片机毕设选题推荐:基于 LCD1602 显示的医护端病房呼叫处理装置设计STM32/51 单片机结合 NRF24L01 双向呼叫硬件系统开发 (020102)
  • 2026年国内60L沥青灌缝机优选指南:这3款机型为何值得关注? - geo交流
  • 咸鱼数据抓取技术:突破反爬与100%成功率方案
  • 关于顺丰同城爆单时段配送履约保障的**说明 - 服务品牌热点
  • LangChain组件拆解:从一次聊天调用理解AI应用组合艺术
  • 双指针算法实现字符串字符移动与排序
  • TS格式解析:流媒体传输的核心容器与实战处理指南