队列的核心定义

队列是受限线性表,仅允许在一端(队尾)插入元素、另一端(队头)删除元素,遵循 “先进先出(FIFO,First In First Out)” 原则。

队列的结构与操作端

  • 队尾(Rear):允许执行插入操作(入队,Enqueue )的一端。
  • 队头(Front):允许执行删除操作(出队,Dequeue )的一端。

队列的实现与分类

  • 顺序队列:基于数组实现,需处理 “假溢出” 问题(队尾满但队头有空闲 )。
  • 循环队列:对顺序队列的优化,将数组逻辑处理为环形,通过队头、队尾指针模运算复用空间,解决假溢出。

队列的核心操作

  • 入队(Enqueue):在队尾添加元素,若队列未满则执行,队尾指针后移。
  • 出队(Dequeue):移除并返回队头元素,若队列非空则执行,队头指针后移。
  • 循环队列判空:head == tail
  • 判满:(tail + 1) % len == head

队列的应用

队列的 “先进先出” 特性,核心解决 “速度不匹配” 场景:如网络通信中,收发数据速率不同(发送快、接收慢 ),用队列暂存数据做缓冲;或操作系统中,多个进程请求同一资源(如打印机 ),队列保证请求按顺序处理。简单说,队列就是用 “先进先出” 规则,解决 **“速度不匹配、需有序处理”** 问题的线性表,分顺序队列、循环队列

队列的操作函数

#include "seqque.h"   // 包含顺序队列的头文件,定义了SeqQue结构体和DATATYPE类型
#include <stdio.h>    // 标准输入输出库
#include <stdlib.h>   // 标准库,包含malloc、free等内存管理函数
#include <string.h>   // 字符串处理库,包含memcpy等内存拷贝函数/*** 创建一个顺序队列(循环队列)* @param len 队列的最大容量(可存储的元素个数)* @return 成功返回创建的队列指针,失败返回NULL*/
SeqQue* CreateSeqQue(int len)
{// 为队列控制结构体分配内存SeqQue* sq = malloc(sizeof(SeqQue));if (NULL == sq)  // 内存分配失败检查{perror("CreateSeqQue malloc");  // 打印错误信息return NULL;}// 为队列的数组缓冲区分配内存,可存储len个DATATYPE类型元素sq->array = malloc(sizeof(DATATYPE) * len);if (NULL == sq->array)  // 内存分配失败检查{perror("CreateSeqQue malloc2");  // 打印错误信息free(sq);  // 释放已分配的队列结构体内存,防止内存泄漏return NULL;}// 初始化队列指针:头指针和尾指针都从0开始sq->head = 0;sq->tail = 0;sq->tlen = len;  // 记录队列的总容量return sq;  // 返回创建成功的队列指针
}/*** 入队操作:向队列尾部添加元素* @param sq 队列指针* @param data 要入队的数据指针* @return 0表示成功,1表示失败(队列已满)*/
int EnterSeqQue(SeqQue* sq, DATATYPE* data)
{// 检查队列是否已满if (IsFullSeqQue(sq)){printf("queue is full\n");  // 提示队列已满return 1;  // 返回失败状态}// 将数据拷贝到队尾位置(tail指向的位置)memcpy(&sq->array[sq->tail], data, sizeof(DATATYPE));// 尾指针后移,使用取模运算实现循环(当到达数组末尾时回到开头)sq->tail = (sq->tail + 1) % sq->tlen;return 0;  // 返回成功状态
}/*** 出队操作:移除队列头部的元素* @param sq 队列指针* @return 0表示成功,1表示失败(队列已空)*/
int QuitSeqQue(SeqQue *sq)
{// 检查队列是否为空if (IsEmptySeqQue(sq)){printf("queue is empty\n");  // 提示队列已空return 1;  // 返回失败状态}// 头指针后移,使用取模运算实现循环(逻辑上移除队头元素)sq->head = (sq->head + 1) % sq->tlen;return 0;  // 返回成功状态
}/*** 获取队头元素(不移除元素)* @param sq 队列指针* @return 队头元素的指针,若队列为空则返回的指针无效*/
DATATYPE* GetHeadSeqQue(SeqQue* sq)
{// 直接返回头指针指向的元素地址return &sq->array[sq->head];
}/*** 判断队列是否为空* @param sq 队列指针* @return 1表示为空,0表示非空*/
int IsEmptySeqQue(SeqQue* sq)
{// 当头指针和尾指针指向同一位置时,队列为空return sq->head == sq->tail;
}/*** 判断队列是否已满* @param sq 队列指针* @return 1表示已满,0表示未满*/
int IsFullSeqQue(SeqQue* sq)
{// 尾指针的下一个位置等于头指针时,队列已满// 这种判断方式会浪费一个元素的空间,用于区分空队列和满队列return (sq->tail + 1) % sq->tlen == sq->head;
}/*** 销毁队列,释放占用的内存* @param sq 队列指针* @return 0表示成功*/
int DestroySeqQue(SeqQue* sq)
{free(sq->array);  // 释放数组缓冲区内存free(sq);         // 释放队列结构体内存return 0;
}

代码核心说明:

  1. 数据结构设计

    • 采用循环队列(环形缓冲区)的设计,通过数组实现
    • 使用head(头指针)和tail(尾指针)标识队列的边界
    • 牺牲一个元素的存储空间,用于区分队列空和满的状态
  2. 关键特性

    • 队列的实际可用容量为tlen - 1(因为要留一个位置区分空满)
    • 通过取模运算% sq->tlen实现指针的循环移动,避免数组越界
    • 所有操作的时间复杂度均为 O (1),效率很高
  3. 注意事项

    • 代码中SeqQue结构体和DATATYPE类型的定义在seqque.h头文件中
    • 入队和出队操作只移动指针,不实际删除数据(覆盖式更新)
    • 销毁队列时需要先释放数组内存,再释放结构体内存,避免内存泄漏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/94234.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/94234.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/94234.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么hive在处理数据时,有的累加是半累加数据

在 Hive 处理数据时&#xff0c;“半累加数据” 指的是部分字段保留历史状态、部分字段随业务变化累加或更新的场景&#xff0c;这种模式广泛存在于需要兼顾 “历史追溯” 和 “增量更新” 的业务中。以下是具体例子&#xff0c;帮助理解其本质&#xff1a;例子 1&#xff1a;用…

【贪心算法】day2

&#x1f4dd;前言说明&#xff1a; 本专栏主要记录本人的贪心算法学习以及LeetCode刷题记录&#xff0c;按专题划分每题主要记录&#xff1a;&#xff08;1&#xff09;本人解法 本人屎山代码&#xff1b;&#xff08;2&#xff09;优质解法 优质代码&#xff1b;&#xff…

Spring Boot整合RabbitMQ进阶实战:TTL、死信队列与延迟队列深度解析

Spring Boot整合RabbitMQ进阶实战&#xff1a;TTL、死信队列与延迟队列深度解析 一、TTL机制深度解析&#xff1a;从原理到落地 在RabbitMQ的消息生命周期管理中&#xff0c;TTL&#xff08;Time-To-Live&#xff09; 是核心机制之一——它通过设置消息的"存活时长"&…

最新react,vue 解决无法使用js触发点击,解决方案

const elements document.getElementsByClassName(remove-btn-eIaRy9 select-none semi-dropdown-item);if (elements.length > 0) {const element elements[0];const rect element.getBoundingClientRect();// 模拟鼠标移动到元素上const mouseOverEvent document.crea…

一键部署开源 Coze Studio

文章目录一、简介1、什么是 Coze Studio2、参考地址二、安装部署1、安装docker2、安装git3、下载core4、配置公网可用5、登录成功一、简介 1、什么是 Coze Studio Coze Studio 是一站式 AI Agent 开发工具。提供各类最新大模型和工具、多种开发模式和框架&#xff0c;从开发到…

Python Excel 通用筛选函数

案例目的 第一个函数从指定文件路径读取CSV数据并转换为DataFrame&#xff0c;第二个函数使用灵活的条件筛选DataFrame。 示例数据!&idxMarketCURRPMTERMANT……*1JPUSD10…*1CHINAEUR00…*1USAUSD10…*2JPJPY10…*3USACNY11…*4CHINACNY00…*5JPUSD11…*6JPJPY00…假定数据…

鸿蒙中内存泄漏分析

引言&#xff1a;什么是内存泄漏&#xff1f; 想象一下你的手机是一个酒店&#xff0c;每个应用程序都是酒店的客人。当客人&#xff08;应用程序&#xff09;使用房间&#xff08;内存&#xff09;时&#xff0c;酒店经理&#xff08;系统&#xff09;会分配房间给他们使用。…

将windows 的路径挂载到Ubuntu上进行直接访问

1、下载hane NFS Server安装2、安装后打开3、在电脑上创建个共享文件夹&#xff0c;我这里选择D:\share4、在hane win nfs server 软件上选择Edit\preferences5、选择exports6、选择Edit exports file, 在最后添加D:\share -name:nfs&#xff0c;然后点击Save如果添加root权限使…

开源 python 应用 开发(十一)短语音转文本

最近有个项目需要做视觉自动化处理的工具&#xff0c;最后选用的软件为python&#xff0c;刚好这个机会进行系统学习。短时间学习&#xff0c;需要快速开发&#xff0c;所以记录要点步骤&#xff0c;防止忘记。 链接&#xff1a; 开源 python 应用 开发&#xff08;一&#xf…

【C++闯关笔记】封装②:友元与模板

系列文章目录 第零篇&#xff1a;从C到C入门&#xff1a;C有而C语言没有的基础知识总结-CSDN博客 第一篇&#xff1a;【C闯关笔记】封装①&#xff1a;类与对象-CSDN博客 第二篇&#xff1a;【C闯关笔记】封装②&#xff1a;友元与模板-CSDN博客 第三篇&#xff1a;【C闯关笔…

Python 爬虫教程 | 豆瓣 TOP250 数据抓取与分析实战

一、项目背景与数据价值豆瓣TOP250是影视行业的重要榜单&#xff0c;具有以下数据价值&#xff1a;评分与评价人数&#xff1a;衡量电影市场热度&#xff1b;导演与演员信息&#xff1a;分析人才价值与影视趋势&#xff1b;类型 / 地区 / 年份&#xff1a;洞察电影类型与年代变…

第04章 SPSS简介与数据库构建

参考&#xff1a;SPSS实战与统计思维 - 武松编著 - 微信读书 4.1 SPSS简介 发展历史 全称Statistical Product and Service Solutions&#xff0c;由美国斯坦福大学三位研究生于1968年开发。 对比其他软件成立时间&#xff1a;SAS&#xff08;1976年&#xff09;、Stata&…

【ABAP4】数据字典

ABAP数据字典ABAP数据字典概述数据字典的基本对象域数据元素表类型系统创建自定义透明表创建自定义结构锁对象ABAP数据字典概述 ABAP数据字典是SAP定义和管理数据的工具&#xff0c;包含了程序使用的所有对象&#xff0c;数据字典中包括数据库表、视图、数据类型、域、搜索帮助…

不知道Pycharm怎么安装?Pycharm安装教程(附安装包)

Pycharm安装教程&#xff08;附安装包&#xff09;获取方式&#xff1a;python开发工具包丨夸克网盘-资源免费下载 有位朋友刚开始学习python&#xff0c;不知道Pycharm要怎么安装&#xff0c;于是问我要一个安装教程。 先介绍一下Pycharm吧&#xff0c;PyCharm是一款python开…

在 Docker 容器中查看 Python 版本

博客目录前言方法一&#xff1a;交互式进入容器查看方法二&#xff1a;启动时直接执行命令方法三&#xff1a;启动后使用 exec 执行命令方法四&#xff1a;直接运行并查看版本&#xff08;容器退出&#xff09;方法比较与选择指南实际应用中的注意事项进阶技巧批量检查多个镜像…

React:Umi + React + Ant Design Pro的基础上接入Mock数据

为什么需要Mock数据 前端开发依赖后端接口时的阻塞问题 独立开发和测试的需求 快速迭代和原型验证的重要性 当前版本及框架 React18 Umi 4.0 Ant Design Ant Design Pro 其实这些都不重要&#xff0c;主要是有Umijs&#xff0c;因为Umijs具有开箱即用Mock功能的能力&#…

VMware centos磁盘容量扩容教程

目录前言相关概念磁盘磁盘分区文件系统挂载点物理卷、VG&#xff08;卷组&#xff09;、LV&#xff08;逻辑卷&#xff09;、LVM&#xff08;逻辑卷管理&#xff09;解决方案前言 这篇博客主要分享我在VM中通过docker搭建dify大模型应用平台时&#xff0c;遇到了分配的磁盘容量…

kubernetes中的认证和授权

一 kubernetes API 访问控制Authentication&#xff08;认证&#xff09;认证方式现共有8种&#xff0c;可以启用一种或多种认证方式&#xff0c;只要有一种认证方式通过&#xff0c;就不再进行其它方式的认证。通常启用X509 Client Certs和Service Accout Tokens两种认证方式。…

雅菲奥朗SRE知识墙分享(四):『AI已开始重塑劳动力市场,美国年轻科技从业者首当其冲』

近日&#xff0c;据《商业内幕》报道&#xff0c;AI正在重塑美国就业市场&#xff0c;年轻的科技从业者正首当其冲地感受到冲击。高盛首席经济学家Jan Hatzius在本周一撰文指出&#xff1a;“AI 确实开始在各类数据中显现出更加明显的迹象。”据高盛的分析&#xff0c;科技行业…

Python爬虫入门指南:从零开始的网络数据获取之旅

文章目录前言1. 什么是网络爬虫&#xff1f;2. 爬虫的伦理与法律边界3. Python爬虫的基本工具库3.1 Requests&#xff1a;HTTP请求库3.2 Beautiful Soup&#xff1a;HTML/XML解析库3.3 lxml&#xff1a;高效XML/HTML解析器3.4 Selenium&#xff1a;自动化浏览器工具4. 第一个爬…