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

Linux环境下的C语言编程(三十九)

三、队列的基本操作(接三十八)

1. 基本数据结构定义

#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define MAX_SIZE 100 // 队列最大容量 // 队列结构体定义 typedef struct { int data[MAX_SIZE]; // 存储数据的数组 int front; // 队头指针 int rear; // 队尾指针 int size; // 当前队列大小 } Queue;

二、队列基本操作实现

1. 初始化队列

// 初始化队列 void initQueue(Queue* q) { q->front = 0; // 队头指针初始化为0 q->rear = -1; // 队尾指针初始化为-1(表示空队列) q->size = 0; // 队列大小为0 }

2. 判断队列是否为空

// 检查队列是否为空 bool isEmpty(Queue* q) { // 方法1:使用size变量 return q->size == 0; // 方法2:使用front和rear指针(循环队列) // return (q->front == (q->rear + 1) % MAX_SIZE); }

3. 判断队列是否已满

// 检查队列是否已满 bool isFull(Queue* q) { // 方法1:使用size变量 return q->size == MAX_SIZE; // 方法2:使用front和rear指针(循环队列) // return ((q->rear + 2) % MAX_SIZE == q->front); }

4. 入队操作

// 将元素添加到队列尾部 bool enqueue(Queue* q, int value) { if (isFull(q)) { printf("错误:队列已满,无法添加元素 %d\n", value); return false; // 入队失败 } // 移动rear指针(循环队列) q->rear = (q->rear + 1) % MAX_SIZE; // 在rear位置插入元素 q->data[q->rear] = value; // 队列大小增加 q->size++; printf("成功入队: %d (位置: %d)\n", value, q->rear); return true; // 入队成功 }

5. 出队操作

// 从队列头部移除元素 bool dequeue(Queue* q, int* value) { if (isEmpty(q)) { printf("错误:队列为空,无法移除元素\n"); return false; // 出队失败 } // 获取队头元素 *value = q->data[q->front]; // 移动front指针(循环队列) q->front = (q->front + 1) % MAX_SIZE; // 队列大小减少 q->size--; printf("成功出队: %d (新队头位置: %d)\n", *value, q->front); return true; // 出队成功 }

6. 查看队头元素

// 获取队头元素但不移除 bool peekFront(Queue* q, int* value) { if (isEmpty(q)) { printf("错误:队列为空,无队头元素\n"); return false; } *value = q->data[q->front]; printf("队头元素: %d\n", *value); return true; }

7. 查看队尾元素

// 获取队尾元素但不移除 bool peekRear(Queue* q, int* value) { if (isEmpty(q)) { printf("错误:队列为空,无队尾元素\n"); return false; } *value = q->data[q->rear]; printf("队尾元素: %d\n", *value); return true; }

8. 获取队列大小

// 返回队列中元素的数量 int getSize(Queue* q) { return q->size; // 如果不使用size变量,可以用以下公式计算: // return (q->rear - q->front + MAX_SIZE) % MAX_SIZE + 1; }

9. 清空队列

// 清空队列中的所有元素 void clearQueue(Queue* q) { q->front = 0; q->rear = -1; q->size = 0; printf("队列已清空\n"); }

三、完整的队列操作示例

// 打印队列内容 void printQueue(Queue* q) { if (isEmpty(q)) { printf("队列为空\n"); return; } printf("队列内容 (从队头到队尾): "); if (q->front <= q->rear) { // 正常情况:front <= rear for (int i = q->front; i <= q->rear; i++) { printf("%d ", q->data[i]); } } else { // 循环情况:rear < front for (int i = q->front; i < MAX_SIZE; i++) { printf("%d ", q->data[i]); } for (int i = 0; i <= q->rear; i++) { printf("%d ", q->data[i]); } } printf("\n"); } // 显示队列状态 void displayQueueStatus(Queue* q) { printf("\n=== 队列状态 ===\n"); printf("队头位置: %d\n", q->front); printf("队尾位置: %d\n", q->rear); printf("队列大小: %d\n", getSize(q)); printf("队列容量: %d\n", MAX_SIZE); printf("是否为空: %s\n", isEmpty(q) ? "是" : "否"); printf("是否已满: %s\n", isFull(q) ? "是" : "否"); printQueue(q); } // 主函数:测试队列基本操作 int main() { Queue myQueue; int value; printf("=== 队列基本操作演示 ===\n"); // 1. 初始化队列 printf("\n1. 初始化队列\n"); initQueue(&myQueue); displayQueueStatus(&myQueue); // 2. 入队操作 printf("\n2. 入队操作演示\n"); printf("入队元素: 10, 20, 30, 40, 50\n"); enqueue(&myQueue, 10); enqueue(&myQueue, 20); enqueue(&myQueue, 30); enqueue(&myQueue, 40); enqueue(&myQueue, 50); displayQueueStatus(&myQueue); // 3. 查看队头和队尾 printf("\n3. 查看队头和队尾\n"); peekFront(&myQueue, &value); peekRear(&myQueue, &value); // 4. 出队操作 printf("\n4. 出队操作演示\n"); dequeue(&myQueue, &value); printf("出队元素: %d\n", value); dequeue(&myQueue, &value); printf("出队元素: %d\n", value); displayQueueStatus(&myQueue); // 5. 获取队列大小 printf("\n5. 获取队列大小\n"); printf("当前队列大小: %d\n", getSize(&myQueue)); // 6. 继续入队 printf("\n6. 继续入队操作\n"); printf("入队元素: 60, 70, 80\n"); enqueue(&myQueue, 60); enqueue(&myQueue, 70); enqueue(&myQueue, 80); displayQueueStatus(&myQueue); // 7. 批量出队 printf("\n7. 批量出队直到队列为空\n"); while (!isEmpty(&myQueue)) { dequeue(&myQueue, &value); printf("出队: %d, 剩余大小: %d\n", value, getSize(&myQueue)); } displayQueueStatus(&myQueue); // 8. 测试边界情况 printf("\n8. 测试边界情况\n"); printf("从空队列出队: "); dequeue(&myQueue, &value); // 应该失败 printf("查看空队列的队头: "); peekFront(&myQueue, &value); // 应该失败 // 9. 清空队列 printf("\n9. 清空队列\n"); clearQueue(&myQueue); displayQueueStatus(&myQueue); return 0; }

3. 操作的正式定义

操作函数名参数返回值说明
初始化initQueue()Queue指针void初始化队列
判空isEmpty()Queue指针bool检查队列是否为空
判满isFull()Queue指针bool检查队列是否已满
入队enqueue()Queue指针, 元素值bool元素添加到队尾
出队dequeue()Queue指针, 接收指针bool移除队头元素
查看队头peekFront()Queue指针, 接收指针bool获取队头元素
查看队尾peekRear()Queue指针, 接收指针bool获取队尾元素
获取大小getSize()Queue指针int返回元素数量
清空队列clearQueue()Queue指针void清空所有元素

四、状态转换图

初始状态 ↓ [空队列] (isEmpty = true) ↓ Enqueue(x) [队列: x] (size = 1) ↓ Enqueue(y) [队列: x ← y] (size = 2) ↓ Dequeue() → 返回x [队列: y] (size = 1) ↓ Dequeue() → 返回y [空队列] (isEmpty = true) ↓ Dequeue() [错误/异常:队列为空]

五、关键特性总结

特性描述重要性
顺序性元素保持严格的入队顺序确保公平性
有限访问只能访问队头和队尾保证数据完整性
动态性大小随操作变化适应不同场景需求
效率基本操作都是O(1)高性能实现基础
简洁性接口简单明了易于理解和实现
http://www.cnnetsun.cn/news/26595.html

相关文章:

  • 毕业设计实战:基于SSM+MySQL的图书商城管理系统设计与实现,从需求到测试全流程拆解,新手也能轻松通关!
  • 毕业设计实战:基于Java+MySQL的校园二手书交易平台设计与实现,从需求到上线全流程避坑指南!
  • 毕业设计实战:基于SSM+MySQL的问卷调查系统,避开这些坑轻松搞定毕设!
  • 非正弦反电动势下PMSM与BLDC无感控制算法研究:自适应谐波估计降低转矩脉动
  • 单相并网逆变器Matlab仿真:离网仿真与PLL锁相环研究,电感电流谐波含量THD优化仿真效果
  • Kate 高级文本编辑器 v26.03.70 官方中文版
  • yadm 完整使用指南:从入门到精通掌握点文件管理
  • 基于Web的大学生体测管理系统设计与实现中期(1)
  • 代码随想录算法训练营第四十三天 | 98. 所有可达路径
  • GBase 8a数据库集群硬件部署安装建议
  • GBase数据库护航国家管网SCADA系统四年无中断平稳运行
  • 一文搞定 AI 智能体架构设计的9大核心技术
  • 计算机毕业设计springboot基于JAVA的校园图书馆管理系统的设计与实现 基于Spring Boot框架的校园图书馆信息化管理系统开发与应用研究 利用Spring Boot与Java技术构建的高
  • 数据结构==LRU Cache ==
  • AMD ROCm平台上的YOLOv8目标检测:从入门到精通的5步优化指南
  • 如何让GPT-5.2成为你职场上的得力助手?这5大功能必看!
  • 如何快速掌握YOLOv12:实时目标检测的完整实践指南
  • PINNs-Torch:用PyTorch轻松实现物理信息神经网络
  • JavaScript学习笔记:5.函数
  • Apache Kvrocks数据库部署实战:从零到一的完整搭建教程
  • 16、远程系统管理与安全防护指南
  • 施耐德BMENOC0321C:高性能模块化驱动控制器(增强通信版)
  • 金融人转AI:从入门到上手,我的“证书认证+技能”学习路线分享
  • 模块化多电平变换器MMC(20子模块、21电平,工作条件220kV(AC)/400kV(DC)...
  • 生态共舞!恭喜10家企业荣获“2025龙蜥社区最佳联合解决方案奖”
  • Java常见开发框架大比拼:Jeesite 、jeecgBoot、smartAdmin、ruoyi
  • IDEA(2020版)实现HttpServletRequest对象
  • 跨平台开发框架选型指南:Uniapp、React Native、Flutter
  • 数字孪生软件开发公司
  • springboot基于vue的校园报修管理系统设计与实现_t45k51ip