数据结构的队列(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.rhkb.cn/news/317934.html

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

相关文章

怎么设置 idea terminal 窗口的编码格式

1 修改Terminal 窗口为 Git bash 窗口 打开 settings 设置界面&#xff0c;选择 Tools 中的 Terminal (File -> settings -> Tools -> Terminal) 修改 Shell path 为你的 Git bash 安装路径&#xff0c;我的在 C:\my_software\java\Git\bin\bash.exe 2 解决中文显示…

面试官:Mysql优化你有哪些方面的经验?

硬件和操作系统层面的优化 从硬件层面来说&#xff0c;影响 Mysql 性能的因素有&#xff0c;CPU、可用内存大小、磁盘读写速度、 网络带宽 从操作系层面来说&#xff0c;应用文件句柄数、操作系统网络的配置都会影响到 Mysql 性能。 这部分的优化一般由 DBA 或者运维工程师去完…

[蓝桥杯2024]-PWN:fd解析(命令符转义,标准输出重定向,利用system(‘$0‘)获取shell权限)

查看保护 查看ida 这里有一次栈溢出&#xff0c;并且题目给了我们system函数。 这里的知识点没有那么复杂 方法一&#xff08;命令转义&#xff09;&#xff1a; 完整exp&#xff1a; from pwn import* pprocess(./pwn) pop_rdi0x400933 info0x601090 system0x400778payloa…

数据结构复习指导之数组和特殊矩阵

文章目录 数组和特殊矩阵 考纲内容 复习提示 前言 1.数组的定义 2.数组的存储结构 3.特殊矩阵的压缩存储 3.1对称矩阵 3.2三角矩阵 3.3三对角矩阵 4.稀疏矩阵 5.知识回顾 数组和特殊矩阵 考纲内容 &#xff08;一&#xff09;栈和队列的基本概念 &#xff08;二&a…

Docker-Compose概述与简单编排部署

目录 前言 一、Docker-Compose 概述 1、Docker-Compose 概念 2、Docker-Compose 优缺点 2.1 Docker-Compose 优点 2.2 Docker-Compose 缺点 3、Docker-Compose与Docker-Swarm的区别 二、两大文件格式 1、YAML 文件格式 2、JOSON 文件格式 3、YAML 与 JOSON 格式的区…

【Mac】Mac安装软件常见问题解决办法

前言 刚开始用Mac系统的小伙伴或者在更新系统版本后运行App的朋友会经常碰到弹窗提示「xxx已损坏&#xff0c;无法打开&#xff0c;您应该将它移到废纸篓」、「打不开xxx&#xff0c;因为Apple无法检查其是否包含恶意软件」、「打不开xxx&#xff0c;因为它来自身份不明的开发…

​「Python大数据」词频数据渲染词云图导出HTML

前言 本文主要介绍通过python实现数据聚类、脚本开发、办公自动化。词频数据渲染词云图导出HTML。 一、业务逻辑 读取voc数据采集的数据批处理,使用jieba进行分词,去除停用词词频数据渲染词云图将可视化结果保存到HTML文件中二、具体产出 三、执行脚本 python wordCloud.p…

基于肤色模型的人脸识别FPGA实现,包含tb测试文件和MATLAB辅助验证

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 matlab2022a的测试结果如下&#xff1a; vivado2019.2的仿真结果如下&#xff1a; 将数据导入到matlab中&#xff0c; 系统的RTL结构图如下图所示…

格瑞威特 | 邀您参加2024全国水科技大会暨技术装备成果展览会

—— 展位号&#xff1a;A13 —— 企业介绍 北京格瑞威特环保设备有限公司成立于2009年&#xff0c;是专业从事设计、研发、销售智能加药计量泵、在线水质分析仪表、便携式水质分析仪表、流量计、液位计、阀门、搅拌机、烟气报警仪、加药装置等各类水处理设备及配件的OEM供服…

react-lib 读取本地模板创建PDF

读取本地文件和读取远程的一样&#xff0c;都使用fetch去获取 async function modifyPdf() {let url ./template.pdflet existingPdfBytes await fetch(url).then(res > res.arrayBuffer()) // 这里也有问题要转一下const d new Uint8Array(existingPdfBytes)const pdfDo…

springboot 自动配置源码解读

什么是自动装配 当我们程序依赖第三方功能组件时&#xff0c;不需要手动将这些组件类加载到IOC容器中。例如 当程序需要用到redis时&#xff0c;在pom.xml文件中引入依赖&#xff0c;然后使用依赖注入的方式直接从IOC容器中拿到相应RedisTemplate实例。 SpringBootApplication …

kubernetes中使用ELK进行日志收集

目录 一、需要收集哪些日志 1、kubernetes集群的系统组件日志 2、应用日志 二、日志收集方案ELK 1、收集日志&#xff1a;Logstash 2、存储日志&#xff1a;Elasticsearch 3、展示日志&#xff1a;Kibana 三、安装elk 1、下载安装包 2、创建用户并切换到新用户 3、上…

NLP(10)--TFIDF优劣势及其应用Demo

前言 仅记录学习过程&#xff0c;有问题欢迎讨论 TF*IDF&#xff1a; 优势&#xff1a; 可解释性好 可以清晰地看到关键词 即使预测结果出错&#xff0c;也很容易找到原因 计算速度快 分词本身占耗时最多&#xff0c;其余为简单统计计算 对标注数据依赖小 可以使用无标注语…

[RocketMq:基于容器化]:快速部署安装

文章目录 一&#xff1a;相关镜像准备&#xff1a;RocketNameServer1.1&#xff1a;查看相关镜像和版本1.2&#xff1a;拉取镜像1.3&#xff1a;配置和运行RocketNameServer容器 二&#xff1a;相关镜像准备&#xff1a;RocketBroker2.1&#xff1a;创建配置目录和broker配置文…

使用docker创建rocketMQ主从结构,使用

1、 创建目录 mkdir -p /docker/rocketmq/logs/nameserver-a mkdir -p /docker/rocketmq/logs/nameserver-b mkdir -p /docker/rocketmq/logs/broker-a mkdir -p /docker/rocketmq/logs/broker-b mkdir -p /docker/rocketmq/store/broker-a mkdir -p /docker/rocketmq/store/b…

计算机网络 -- 多人聊天室

一 程序介绍和核心功能 这是基于 UDP 协议实现的一个网络程序&#xff0c;主要功能是 构建一个多人聊天室&#xff0c;当某个用户发送消息时&#xff0c;其他用户可以立即收到&#xff0c;形成一个群聊。 这个程序由一台服务器和n个客户端组成&#xff0c;服务器扮演了一个接受…

vue 实现项目进度甘特图

项目需求&#xff1a; 实现以1天、7天、30天为周期&#xff08;周期根据筛选条件选择&#xff09;&#xff0c;展示每个项目不同里程碑任务进度。 项目在Vue-Gantt-chart: 使用Vue做数据控制的Gantt图表基础上进行了改造。 有需要的小伙伴也可以直接引入插件&#xff0c;自己…

装饰器模式、代理模式、适配器模式对比

装饰器模式、代理模式和适配器模式都是结构型设计模式&#xff0c;它们的主要目标都是将将类或对象按某种布局组成更大的结构&#xff0c;使得程序结构更加清晰。这里将装饰器模式、代理模式和适配器模式进行比较&#xff0c;主要是因为三个设计模式的类图结构相似度较高、且功…

4-1 STM32C8T6控制OLED显示

实物接线&#xff1a; #include "stm32f10x.h" // Device header #include "delay.h" #include "LED.h" #include "Key.h" #include "Buzzer.h" #include "Oled.h"int main(void) {OLED_Init()…

基于SpringBoot实现各省距离Excel导出实战

目录 前言 一、列表及图表信息展示 1、数据过滤调整 2、信息列表及图表展示 3、Excel写入 二、界面可视化 1、Echarts图表和列表展示 2、城市详情和下载功能设计 三、成果展示 1、图表展示 2、部分城市数据分析 总结 前言 今天是五一黄金周假期第二天&#xff0c;不知…