当前位置: 首页 > 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.dtcms.com/a/320236.html

相关文章:

  • RAGAS:检索增强生成系统的无参考评估框架与技术解析
  • 2025年华数杯C题超详细解题思路
  • 哈希表原理与实现全解析
  • 天道20金句
  • Moses工具的配置和小语种平行语料训练SMT完整实现
  • 大模型 Transformer模型(上)
  • Java集合的遍历方式(全解析)
  • 力扣经典算法篇-46-阶乘后的零(正向步长遍历,逆向步长遍历)
  • BGP笔记整理
  • Maven高级:继承与聚合实战指南
  • RS485转Profibus网关在QDNA钠离子分析仪与300PLC通信中的应用解析
  • 【OCCT+ImGUI系列】013-碰撞检测-包围盒Bnd_Box
  • 【入门级-C++程序设计:9、函数与递归-函数定义与调用、形参与实参】
  • RESTful 服务概述:从理念到实践的全面解析
  • Coze开放平台综合文档指南
  • 达梦包含OR条件的SQL特定优化----INJECT-HINT优化方法
  • 最新完整内、外期货量化交易系统C#源码可售
  • 【C#补全计划:类和对象(九)】接口
  • redis--黑马点评--用户签到模块详解
  • dubbo源码之编解码逻辑
  • 一场 Dark Theme A/B 测试的复盘与提效实践
  • 聚集索引VS非聚集索引:核心差异详解
  • rebase 和pull的通俗区别是什么
  • 一个基于固定 IP地址查询天气的 C 语言程序,通过调用第三方天气 API:
  • React 多语言(i18n)方案全面指南
  • 计算机英语详细总结
  • 本地化密码恢复工具的技术实现与应用边界
  • RabbitMQ面试精讲 Day 13:HAProxy与负载均衡配置
  • Git `cherry-pick` 工具汇总
  • Docker 加载镜像时出现 “no space left on device” 错误的解决方法