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

数据结构(循环顺序队列)

在数据结构中,队列(Queue)是一种先进先出(FIFO)的线性结构。而循环顺序队列是对顺序队列的一种优化,可以避免因出队而造成空间浪费。

数据结构说明

定义顺序队列结构体 Sequqe

#define MAX_LEN 100   // 队列容量上限
typedef int DataType; // 可根据需要修改为其他类型typedef struct Sequqe {DataType *pbase;  // 指向数据存储区域(数组)int phead;        // 指向队头(第一个元素)int ptail;        // 指向队尾(下一个可插入的位置)
} Sequqe;

完整代码实现

#include "seqquene.h"
#include <stdio.h>
#include <stdlib.h>// 创建队列
Sequqe *CreatSeqque() {Sequqe *seq = malloc(sizeof(Sequqe));if(NULL == seq) {printf("malloc seq error\n");return NULL;}seq->pbase = malloc(sizeof(DataType) * MAX_LEN);if(seq->pbase == NULL) {printf("malloc pbase error\n");return NULL;}seq->phead = 0;seq->ptail = 0;return seq;
}// 入队
int PushSeqquene(Sequqe *seq, DataType data) {if(IsFull(seq)) {printf("Is Full\n");return -1;}seq->pbase[seq->ptail] = data;seq->ptail = (seq->ptail + 1) % MAX_LEN;return 0;
}// 出队
int PopSeqquene(Sequqe *seq, DataType *deldata) {if(IsEmpty(seq)) {printf("Is Empty\n");return -1;}if(deldata) {*deldata = seq->pbase[seq->phead];}seq->phead = (seq->phead + 1) % MAX_LEN;return 0;
}// 打印队列所有元素
int ShowSeqquene(Sequqe *seq) {if(IsEmpty(seq)) {printf("Is Empty\n");return -1;}int i;for(i = seq->phead; i != seq->ptail; i = (i + 1) % MAX_LEN) {printf("%d ", seq->pbase[i]);}puts("");return 0;
}// 获取队头元素
int GetTop(Sequqe *seq, DataType *topdata) {if(IsEmpty(seq) || NULL == topdata) {printf("Is Empty\n");return -1;}*topdata = seq->pbase[seq->phead];return 0;
}// 销毁队列,释放内存
int DestroySeqquene(Sequqe **seq) {free((*seq)->pbase);free(*seq);*seq = NULL;return 0;
}// 判断是否队满(循环条件)
int IsFull(Sequqe *seq) {return (seq->ptail + 1) % MAX_LEN == seq->phead;
}// 判断是否队空
int IsEmpty(Sequqe *seq) {return seq->phead == seq->ptail;
}

代码核心逻辑解析

函数名功能说明
CreatSeqque创建队列,初始化数组与头尾指针
PushSeqquene入队:在尾部插入元素,尾指针循环前进
PopSeqquene出队:从头部取出元素,头指针循环前进
IsFull判断队列是否已满(尾指针的下一个是头指针)
IsEmpty判断队列是否为空(头尾指针相等)
GetTop查看队头元素但不出队
ShowSeqquene打印所有元素,循环方式遍历
DestroySeqquene销毁队列并释放内存资源

示例测试代码(main函数)

int main() {Sequqe *q = CreatSeqque();PushSeqquene(q, 10);PushSeqquene(q, 20);PushSeqquene(q, 30);ShowSeqquene(q);  // 输出:10 20 30int val;PopSeqquene(q, &val);printf("Popped: %d\n", val);  // 输出:10GetTop(q, &val);printf("Top: %d\n", val);     // 输出:20ShowSeqquene(q);  // 输出:20 30DestroySeqquene(&q);return 0;
}

优点和应用场景

优点

  • 使用循环数组实现,不会浪费空间
  • 插入和删除操作时间复杂度 O(1)
  • 结构简单、效率高

适用场景

  • 任务调度
  • IO 缓冲区
  • 数据流处理
  • 有限资源排队系统(如打印机任务、客户排队等)
http://www.lryc.cn/news/612718.html

相关文章:

  • java 生成pdf导出
  • iOS 文件管理实战指南,用户文件、安全访问与开发调试方案
  • OpenCv对图片视频的简单操作
  • Flutter 局部刷新方案对比:ValueListenableBuilder vs. GetBuilder vs. Obx
  • PPT漏斗图,让数据更美观!
  • OpenAI重磅发布:GPT最新开源大模型gpt-oss系列全面解析
  • 【沉浸式解决问题】mysql-connector-python连接数据库:RuntimeError: Failed raising error.
  • 计算机视觉(opencv)——图像本质、数字矩阵、RGB + 基本操作(实战一)
  • Java面试宝典:JVM的垃圾收集算法
  • Linux中chmod命令
  • JAVA,Maven分模块设计
  • 初识C++类的6个默认成员函数
  • 模拟-38.外观数列-力扣(LeetCode)
  • 【数据库】如何从本地电脑连接服务器上的MySQL数据库?
  • 国内主流数据集成厂商有哪些?有那些免费的数据集成平台?
  • 【Java】Predicate使用案例
  • 【CS创世SD NAND征文】额贴式睡眠监测仪的数据守护者:存储芯片如何实现7×24小时安眠状态下的全时稳定记录
  • Nuclei漏洞扫描工具(除了常见漏洞还支持CMS常见漏洞Gitlab、Jira、Splunk、Elastic)
  • 2025年主流开源音视频播放项目深度解析
  • Java技术栈/面试题合集(20)-运维与线上问题排查篇
  • nvm安装,nvm管理node版本
  • 【数据结构初阶】--排序(五)--计数排序,排序算法复杂度对比和稳定性分析
  • MATLAB科研数据可视化
  • 【CDA案例】数据分析案例拆解:解锁数据分析全流程!
  • 图像认知与OpenCV——图像预处理4
  • 计算机视觉--opencv(代码详细教程)
  • Java垃圾回收(GC)探析
  • 网络可视,运维无忧:分钟级定位,告别盲目扩容
  • 华为开源CANN,再次释放“昇腾转向”信号
  • spring boot学习计划