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

数据结构:队列的顺序存储实现

队列是一种先进先出(FIFO)的线性数据结构,顺序存储实现通常使用数组来存储元素。以下是队列的顺序存储实现代码:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>#define MAX_SIZE 100  // 队列的最大容量typedef struct {int data[MAX_SIZE];int front;      // 队头指针int rear;       // 队尾指针
} SeqQueue;// 初始化队列
void InitQueue(SeqQueue *q) {q->front = q->rear = 0;
}// 判断队列是否为空
bool IsEmpty(SeqQueue *q) {return q->front == q->rear;
}// 判断队列是否已满
bool IsFull(SeqQueue *q) {return (q->rear + 1) % MAX_SIZE == q->front;
}// 入队操作
bool EnQueue(SeqQueue *q, int value) {if (IsFull(q)) {printf("队列已满,无法入队\n");return false;}q->data[q->rear] = value;q->rear = (q->rear + 1) % MAX_SIZE;  // 循环队列return true;
}// 出队操作
bool DeQueue(SeqQueue *q, int *value) {if (IsEmpty(q)) {printf("队列为空,无法出队\n");return false;}*value = q->data[q->front];q->front = (q->front + 1) % MAX_SIZE;  // 循环队列return true;
}// 获取队头元素
bool GetHead(SeqQueue *q, int *value) {if (IsEmpty(q)) {printf("队列为空\n");return false;}*value = q->data[q->front];return true;
}// 打印队列中的元素
void PrintQueue(SeqQueue *q) {if (IsEmpty(q)) {printf("队列为空\n");return;}printf("队列元素: ");int i = q->front;while (i != q->rear) {printf("%d ", q->data[i]);i = (i + 1) % MAX_SIZE;}printf("\n");
}int main() {SeqQueue q;InitQueue(&q);// 测试入队for (int i = 1; i <= 5; i++) {EnQueue(&q, i * 10);}PrintQueue(&q);// 测试出队int value;DeQueue(&q, &value);printf("出队元素: %d\n", value);PrintQueue(&q);// 获取队头元素GetHead(&q, &value);printf("队头元素: %d\n", value);return 0;
}


关键点说明:
循环队列:使用取模运算实现循环队列,解决"假溢出"问题

队空条件:front == rear

队满条件:(rear + 1) % MAX_SIZE == front(牺牲一个存储单元来区分队空和队满)

指针移动:入队和出队操作后,指针都要进行取模运算

http://www.dtcms.com/a/266678.html

相关文章:

  • 【Linux 系统】基础IO——Linux中对文件的理解
  • 【深度学习新浪潮】如何使用大模型等技术基于序列预测蛋白质的结构,功能和靶点?
  • 【学习笔记】Lean4基础 ing
  • 邮科千兆8光8电工业级交换机互联网的脉搏
  • 洛谷刷题8
  • 云原生Kubernetes系列 | Ingress和Egress网络策略NetworkPolicy结合案例使用详解
  • 5060Ti安装黑屏问题一解
  • 【WIP】【VLAVLM——InternVL系列】
  • Maven编译和打包插件
  • cd-agent更换cd模型(自用)
  • i18next + 原生JS 双引擎:打造前端多语言系统最佳实践
  • Android 网络请求优化全面指南
  • 韩国小说《素食者》读后感
  • C++--多态
  • 全网唯一/Qt结合ffmpeg实现手机端采集摄像头推流到rtsp或rtmp/可切换前置后置摄像头/指定分辨率帧率
  • 在 Minikube 上部署 Kubernetes Deployment 并解决 ImagePullBackOff 问题
  • WPS中配置MathType教程
  • stm32学到什么程度可以找工作?
  • Java学习第十二部分——idea各种项目简介
  • 电阻温升评估的相关测试总结
  • openlayers 判断geojson文件是否在视口内
  • Android BitmapRegionDecoder 详解
  • Ethernet IP与Profinet共舞:网关驱动绿色工业的智慧脉动
  • <tauri><rust><GUI>使用tauri创建一个文件夹扫描程序
  • 深度学习前置知识全面解析:从机器学习到深度学习的进阶之路
  • 《Java修仙传:从凡胎到码帝》第三章:缩进之劫与函数峰试炼
  • 鸿蒙系统(HarmonyOS)4.2 设备上实现无线安装 APK 并调试
  • Python-封装和解构-set及操作-字典及操作-解析式生成器-内建函数迭代器-学习笔记
  • React中的useState 和useEffect
  • 记一次Linux手动设置网卡的过程