数据结构的队列(c语言版)

一.队列的概念

1.队列的定义

队列是一种常见的数据结构,它遵循先进先出的原则。类似于现实生活中排队的场景,最先进入队列的元素首先被处理,而最后进入队列的元素则要等到前面的元素都被处理完后才能被处理。

在队列中,元素只能从一端插入,称为队尾,而只能从另一端删除,称为队头。新的元素被插入到队尾,而最早插入的元素位于队头。这样,当一个元素被处理或删除时,它前面的元素就会成为新的队头。

2.队列的应用

队列的应用:

1.任务调度:多个任务按照顺序排队等待执行。

2.广度优先搜索(BFS):在图或树的遍历中,按层次遍历节点。

3.缓存管理:缓存中的数据按照访问顺序排列,最先进入的数据最先被替换。

4.算法设计:某些算法的设计与队列密切相关,如哈夫曼编码、循环队列等。

3.队列的优缺点

优点:

  1. 先进先出(FIFO):队列保持元素的插入顺序,最先插入的元素最先被处理,符合很多实际问题的需求。
  2. 简单高效:队列的基本操作入队和出队的时间复杂度为O(1),无论队列的大小如何,操作的时间复杂度都是固定的。
  3. 应用广泛:队列在很多算法和应用中有广泛的应用,如任务调度、广度优先搜索、缓存管理等。

缺点:

  1. 随机访问困难:队列只允许在队头删除元素,而在队尾插入元素,不支持随机访问。如果需要在其他位置插入或删除元素,操作效率较低。
  2. 队列大小限制:使用数组实现的队列在创建时需要指定最大容量,因此队列的大小有限。如果队列已满,则无法再插入新的元素。
  3. 存储空间浪费:如果队列的实际元素数量远小于最大容量,那么可能会造成存储空间的浪费,因为队列的容量是固定的。

二.队列的功能

队列常见的功能:

  1. 入队:将一个元素插入到队列的尾部,成为新的队尾。
  2. 出队:从队列的头部删除并返回一个元素,将队列的头部指针向后移动一位。
  3. 获取队头元素:返回队列的头部元素,但不删除它。
  4. 检查队列是否为空:检查队列中是否没有元素,即队列是否为空。
  5. 检查队列是否已满:检查队列是否已达到其最大容量,无法再插入新的元素。
  6. 清空队列:将队列中的所有元素删除,使其变为空队列。
  7. 获取队列中元素的数量:返回队列中元素的当前数量。
  8. 遍历队列:从队列的头部开始遍历到尾部,依次访问每个元素。

三.队列的实现

 

1.定义队列结构

Queue 是一个结构体类型,包含以下成员:

  • elements:类型为 int* 的指针,用于存储队列中的元素。通常情况下,可以通过动态内存分配来为该指针分配足够的内存空间,以存储队列的元素。
  • front:整型变量,表示队列头部的索引。它指向队列中的第一个元素。
  • rear:整型变量,表示队列尾部的索引。它指向队列中最后一个元素。
  • maxSize:整型变量,表示队列的最大容量。它用于限制队列中元素的数量,防止队列溢出。
typedef struct {int* elements;  // 存储元素的数组int front;      // 队列头部索引int rear;       // 队列尾部索引int maxSize;    // 队列的最大容量
} Queue;

 2.初始化队列

initQueue(Queue* queue, int maxSize):初始化队列。该函数接受一个指向 Queue 结构的指针以及队列的最大容量 maxSize。在函数内部,它为队列的元素数组分配内存空间,并将队列的头部索引 front 设置为 0,尾部索引 rear 设置为 -1,表示队列为空。

 

// 初始化队列
void initQueue(Queue* queue, int maxSize) {queue->elements = (int*)malloc(sizeof(int) * maxSize);queue->front = 0;queue->rear = -1;queue->maxSize = maxSize;
}

3.判断队列是否为空

isEmpty(Queue* queue):检查队列是否为空。该函数接受一个指向 Queue 结构的指针,并根据队列的头部索引和尾部索引的关系来判断队列是否为空。如果队列为空,返回 1;否则,返回 0。

/ 检查队列是否为空
int isEmpty(Queue* queue) {return (queue->rear < queue->front);
}

 

4.判断队列是否已满

isFull(Queue* queue):检查队列是否已满。该函数接受一个指向 Queue 结构的指针,并根据队列的头部索引和尾部索引的关系来判断队列是否已满。如果队列已满,返回 1;否则,返回 0。

// 检查队列是否已满
int isFull(Queue* queue) {return (queue->rear == queue->maxSize - 1);
}

 

5.入队

enqueue(Queue* queue, int element):入队。该函数接受一个指向 Queue 结构的指针和要插入的元素 element。在函数内部,它首先检查队列是否已满,如果已满,则打印出队列已满的提示信息并返回;否则,将尾部索引 rear 增加 1,并将元素 element 存储在队列的尾部。

// 入队
void enqueue(Queue* queue, int element) {if (isFull(queue)) {printf("队列已满,无法入队。\n");return;}queue->rear++;queue->elements[queue->rear] = element;
}

 

6.出队

dequeue(Queue* queue):出队。该函数接受一个指向 Queue 结构的指针,并返回队列头部的元素。在函数内部,它首先检查队列是否为空,如果为空,则打印出队列为空的提示信息并返回 -1;否则,将头部索引 front 增加 1,并返回队列头部的元素。

// 出队
int dequeue(Queue* queue) {if (isEmpty(queue)) {printf("队列为空,无法出队。\n");return -1;}int element = queue->elements[queue->front];queue->front++;return element;
}

 

7.获取队列头部信息

getFront(Queue* queue):获取队列头部元素。该函数接受一个指向 Queue 结构的指针,并返回队列头部的元素,但不删除它。在函数内部,它首先检查队列是否为空,如果为空,则打印出队列为空的提示信息并返回 -1;否则,返回队列头部的元素。

// 获取队列头部元素
int getFront(Queue* queue) {if (isEmpty(queue)) {printf("队列为空,无法获取头部元素。\n");return -1;}return queue->elements[queue->front];
}

 

8.释放内存

freeQueue(Queue* queue):释放队列内存空间。该函数接受一个指向 Queue 结构的指针,并释放队列的元素数组所占用的内存空间。

// 释放队列内存空间
void freeQueue(Queue* queue) {free(queue->elements);
}

 

四.队列的源码呈现

#include <stdio.h>
#include <stdlib.h>// 定义队列结构
typedef struct {int* elements;  // 存储元素的数组int front;      // 队列头部索引int rear;       // 队列尾部索引int maxSize;    // 队列的最大容量
} Queue;// 初始化队列
void initQueue(Queue* queue, int maxSize) {queue->elements = (int*)malloc(sizeof(int) * maxSize);queue->front = 0;queue->rear = -1;queue->maxSize = maxSize;
}// 检查队列是否为空
int isEmpty(Queue* queue) {return (queue->rear < queue->front);
}// 检查队列是否已满
int isFull(Queue* queue) {return (queue->rear == queue->maxSize - 1);
}// 入队
void enqueue(Queue* queue, int element) {if (isFull(queue)) {printf("队列已满,无法入队。\n");return;}queue->rear++;queue->elements[queue->rear] = element;
}// 出队
int dequeue(Queue* queue) {if (isEmpty(queue)) {printf("队列为空,无法出队。\n");return -1;}int element = queue->elements[queue->front];queue->front++;return element;
}// 获取队列头部元素
int getFront(Queue* queue) {if (isEmpty(queue)) {printf("队列为空,无法获取头部元素。\n");return -1;}return queue->elements[queue->front];
}// 释放队列内存空间
void freeQueue(Queue* queue) {free(queue->elements);
}int main() {Queue queue;int maxSize = 5;// 初始化队列initQueue(&queue, maxSize);// 入队enqueue(&queue, 10);enqueue(&queue, 20);enqueue(&queue, 30);// 出队int element = dequeue(&queue);printf("出队元素:%d\n", element);// 获取队列头部元素int frontElement = getFront(&queue);printf("队列头部元素:%d\n", frontElement);// 释放队列内存空间freeQueue(&queue);return 0;
}

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

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

相关文章

《恶意不息》是一款什么样的游戏,苹果电脑怎么玩《恶意不息》恶意不息游戏内怎么存档 mac电脑玩游戏

近日steam游戏商城新上架了一款名叫《恶意不息》的游戏十分火爆&#xff0c;那么《恶意不息》是一款什么样的游戏&#xff0c;苹果电脑怎么玩《恶意不息》&#xff1f;一起来看看吧&#xff01; 一、《恶意不息》是一款什么样的游戏&#xff1f; Private Division&#xff0c;…

【蓝桥杯嵌入式】第七届省赛 - 模拟液位检测告警系统

代码开源&#xff0c;Gitee自取 代码开源&#xff0c;Gitee自取 代码开源&#xff0c;Gitee自取 目录 0 前言 1 展示 1.1 源码 1.2 演示视频 1.3 题目展示 2 工程配置 3 资源配置&代码实现 3.1 定时器 3.2 液位检测 3.3 液位阈值设定 3.4 液位阈值设定 3.5 串…

BST二叉搜索树

概念 二叉搜索树&#xff08;Binary Search Tree&#xff0c;简称BST&#xff09;&#xff0c;又称为二叉排序树或二叉查找树&#xff0c;是一种特殊的二叉树数据结构。它具有以下基本性质&#xff1a; 节点的值的有序性&#xff1a;对于BST中的任意一个节点&#xff0c;其左…

Angular基础-搭建Angular运行环境

这篇文章介绍了在Angular项目中进行开发环境搭建的关键步骤。包括node.js安装和配置、安装Angular CLI工具、安装angular-router、创建Angular项目等步骤。这篇文章为读者提供了清晰的指南&#xff0c;帮助他们快速搭建Angular开发环境&#xff0c;为后续的项目开发奠定基础。 …

【Debug】TensorRT报错汇总

搭建TensorRT过程参见&#xff1a;【通俗易懂】Windows系统安装TensorRT 下面是运行中的问题汇总及解决。 报错1. No module named ‘pycuda’ 解决&#xff1a; pip install pycuda报错2. AttributeError: ‘tensorrt.tensorrt.Builder’ object has no attribute ‘max_wor…

在ubuntu 24.04 上安装vmware workstation 17.5.1

ubuntu安装在新组装的i9 14900机器上&#xff0c;用来学习笨叔的ARM64体系结构编程&#xff0c;也熟悉Linux的用法。但有时候写文档总是不方便&#xff0c;还是需要window来用。因此想在ubuntu 24.04上安装Linux版本的vmware worksation 17.5.1以虚拟机的方式安装windows 11。其…

信息技术内涵及意义

一、信息技术及其演进趋势 &#xff08;一&#xff09;信息技术概况概念 信息技术&#xff08;Information Technology&#xff0c;IT&#xff09;指“应用在信息加工和处理中的科学、技术与工程的训练方法与管理技巧&#xff1b;上述方法和技巧的应用&#xff1b;计算机及其…

JavaScript+B/S版云LIS系统源码ASP.NET CORE 3.1 MVC云LIS系统如何实现样本追踪的预警功能?医院云LIS检验系统源码

JavaScriptB/S版云LIS系统源码ASP.NET CORE 3.1 MVC云LIS系统如何实现样本追踪的预警功能&#xff1f;医院云LIS检验系统源码 实验室信息管理系统&#xff08;Trasen Laboratory Information Management System&#xff09;是一套专业的医疗实验室信息管理软件&#xff0c;包含…

【C++庖丁解牛】C++11---新的类的功能 | 可变参数模板

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 1.新的类功能1.1 默认成员…

pyqt标签常用qss格式设置

pyqt标签常用qss格式设置 QSS介绍标签常用的QSS设置效果代码 QSS介绍 Qt Style Sheets (QSS) 是 Qt 框架中用于定制应用程序界面样式的一种语言。它类似于网页开发中的 CSS&#xff08;Cascading Style Sheets&#xff09;&#xff0c;但专门为 Qt 应用程序设计。使用 QSS&…

24.4.28(板刷dp,拓扑判环,区间dp+容斥算回文串总数)

星期一&#xff1a; 昨晚cf又掉分&#xff0c;小掉不算掉 补ABC350 D atc传送门 思路&#xff1a;对每个连通块&#xff0c;使其成为一个完全图&#xff0c;完全图的边数为 n*(n-1)/2 , 答案加上每个连通块成为完全图后的…

第十五届蓝桥杯Java软件开发大学B组自我经验小结

自我介绍 23届大一 双非 计院科班 软件工程 江苏人在吉林上大学 Java蒟蒻 在学校的宣传下 有幸参加了第十五届蓝桥杯Java大学b组省赛 蓝桥杯说明 就是一个算法比赛吧 考试时间9.00到1.00 四小时 带准考证和身份证和笔 草稿纸会发 赛制是IOC就是不会给任何反馈 就是你…

富唯智能案例|双3D相机引导衔架抓取铝型材

随着制造业的快速发展和自动化水平的不断提升&#xff0c;铝型材的自动化抓取和加工成为行业内的一大技术难题。铝型材因其轻便、耐腐蚀、易加工等特点&#xff0c;广泛应用于建筑、汽车、电子等领域。然而&#xff0c;铝型材的形状多样、尺寸不一&#xff0c;以及生产线上的高…

【算法系列】哈希表

目录 哈希表总结 leetcode题目 一、两数之和 二、判定是否互为字符重排 三、存在重复元素 四、存在重复元素 II 五、字母异位词分组 六、在长度2N的数组中找出重复N次的元素 七、两个数组的交集 八、两个数组的交集 II 九、两句话中的不常见单词 哈希表总结 1.存储数…

C语言/数据结构——每日一题(链表的中间节点)

一.前言 今天我在LeetCode刷到了一道单链表题&#xff0c;想着和大家分享一下这道题&#xff1a;https://leetcode.cn/problems/middle-of-the-linked-list。废话不多说让我们开始今天的知识分享吧。 二.正文 1.1题目描述 1.2题目分析 这道题有一个非常简便的方法——快慢指…

袁庭新ES系列17节|Spring Data Elasticsearch基础

前言 为了简化对Elasticsearch的操作Spring Data提供了Spring Data Elasticsearch。Spring Data Elasticsearch是Spring Data技术对Elasticsearch原生API封装之后的产物&#xff0c;它通过对原生API的封装&#xff0c;使得程序员可以简单的对Elasticsearch进行各种操作。接下来…

信融算网,创启未来 | 移动云一体化算网调度平台发布

4月29日上午&#xff0c;中国移动算力网络大会“自主可控算力网络应用”分论坛在苏州召开&#xff0c;中国移动云能力中心副总经理吴世俊、中国移动信息技术中心副总经理陈国出席论坛并发表致辞。论坛发布全国首个实现通算、智算、超算、量子计算&#xff0c;以及网络、安全一站…

全栈开发之路——前端篇(2)文件、组件与setup引入

全栈开发一条龙——前端篇 第一篇&#xff1a;框架确定、ide设置与项目创建 本文系该系列第二篇&#xff0c;主要将介绍各个文件的意义、组件结构与导入以及setup的引入。 目录 一、src外文件介绍.gitignore为git忽略文件env.d.ts用于识别其他文件index.htmljson文件vite.confi…

【JAVASE】带你了解的方法魅力

✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;橘橙黄又青-CSDN博客 目标&#xff1a; 1. 掌握方法的定义以及使用 2. 掌握方法传参 3. 掌握方法重载 …

[C++][算法基础]四种基本背包问题(动态规划)

1. 01背包问题 有 &#x1d441; 件物品和一个容量是 &#x1d449; 的背包。每件物品只能使用一次。 第 &#x1d456; 件物品的体积是 &#x1d463;&#x1d456;&#xff0c;价值是 &#x1d464;&#x1d456;。 求解将哪些物品装入背包&#xff0c;可使这些物品的总体…