数据结构的队列(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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Text-to-SQL小白入门(12)Awesome-Text2SQL开源项目star破1000

项目介绍 项目地址 23年9月份刚开源这个项目&#xff0c;大半年过去了&#xff0c;star数终于破1000啦&#xff0c;决定在知乎更新一下内容&#xff0c;看看内容变化&#xff0c;知乎有上当时项目介绍的链接&#xff1a;追光者&#xff1a;Text-to-SQL小白入门&#xff08;六&…

2.1 Java全栈开发前端+后端(全栈工程师进阶之路)-前端框架VUE3-基础-初识Vue

Vue概述 早期前后端分离模式 早期的前后端分离开发模式是这样的&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge">&l…

axios.get请求 重复键问题??

封装的接口方法&#xff1a; 数据&#xff1a; 多选框多选后 能得到对应的数组 但是请求的载荷却是这样的,导致会请求不到数据 departmentChecks 的格式看起来是一个数组&#xff0c;但是通常 HTTP 请求的查询参数不支持使用相同的键&#xff08;key&#xff09;名多次。如…

蓝桥杯练习系统(算法训练)ALGO-953 混合积

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 众所周知&#xff0c;人人都在学习线性代数&#xff0c;既然都学过&#xff0c;那么解决本题应该很方便。   宇宙大战中&…

STM32 看门狗WDG

一、看门狗&#xff08;Watchdog&#xff09; 看门狗可以监控程序的运行状态&#xff0c;当程序因为设计漏洞、硬件故障、电磁干扰等原因&#xff0c;出现卡死或跑飞现象时&#xff0c;看门狗能及时复位程序&#xff0c;避免程序陷入长时间的罢工状态&#xff0c;保证系统的可靠…

BetterDisplay Pro for Mac:显示器校准软件

BetterDisplay Pro for Mac是一款出色的显示器校准软件&#xff0c;旨在提升你的视觉体验。它提供了准确的显示器参数调整&#xff0c;包括亮度、对比度、色温和色域等&#xff0c;让你的显示器呈现更真实、清晰、细腻的图像。此外&#xff0c;软件还提供多种预设模式和自定义选…

ABAP 数据写入Excel 并保存

参考老白 https://www.cnblogs.com/liaojunbo/archive/2011/09/06/2168552.html 但是缺zcl_excel 。需要从 dotabap要引入abap2xlsx 英文版进入后 尝试了一下 1&#xff09;列的宽度自适应么有找到在哪里&#xff1f; 列宽设置 lo_worksheet->set_column_width( ip_co…

基于springboot+vue+Mysql的网上商城购物系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

reactjs后台管理系统搭建

1 通过yarn 模板创建reactjs项目 yarn create vite reactjs-antdesign-admin --template react-ts 2 基础路由测试 定义一个router/index.tsx&#xff0c;里面定义路由组件 const Router: React.FC () > {return (<HashRouter><Switch><Route path"…

设计模式: 责任链模式

目录 一&#xff0c;责任链模式 二&#xff0c;特点 四&#xff0c;实现步骤 五&#xff0c;代码 一&#xff0c;责任链模式 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种软件设计模式&#xff0c;它属于行为型模式。在这种模式中&#xff0c…

WPF之创建无外观控件

1&#xff0c;定义无外观控件。 定义默认样式&#xff0c;在其静态构造函数中调用DefaultStyleKeyProperty.OverrideMetadata()。 //设置默认样式DefaultStyleKeyProperty.OverrideMetadata(typeof(ColorPicker), new FrameworkPropertyMetadata(typeof(ColorPicker))); 在项目…

tomcat篇-windows 运行tomcat的startup.bat时,终端打印的中文显示为乱码

当运行Tomcat的startup.bat时&#xff0c;如果终端中中文显示为乱码&#xff0c;这通常是因为Tomcat使用的日志输出编码与Windows命令行默认的编码不匹配。针对这一问题&#xff0c;你可以尝试以下步骤来解决&#xff1a; 1、执行startup.bat&#xff0c;在输出的窗口右击&…

Android --- 网络请求

通常在 Android 中进行网络连接一般使用 Scoket 和HTTP&#xff0c;HTTP 请求方式比 Scoket 多。HTTP 请求一般采用原生的 HttpClient 和 HttpUrlConnection 的两种网络访问方式&#xff08;系统自带的&#xff09;。但是在 Android 5.0 的时候 Google 就不推荐使用 HttpClient…

【限免】雷达目标生成与探测研究项目【附MATLAB代码】

文章来源&#xff1a;微信公众号&#xff1a;EW Frontier 课题背景 该项目的目标是模拟FMCW雷达检测运动目标&#xff0c;然后执行信号处理功能&#xff0c;以估计模拟目标的距离和多普勒速度。 图1&#xff1a;雷达模拟和检测的项目工作流程 FMCW波形设计 根据系统要求设计…

JAVA Coding 规范

Coding 规范 文章目录 Coding 规范一.文件规范1.1 声明1.2 缩进1.3 空行1.4 空格1.5 对齐1.6 小括号1.7 花括号1.8 代码长度 二.命名规范2.1 命名总则2.2 命名空间2.3 类与接口2.4 方法命名2.5 属性命名2.6 常量命名2.7 变量命名 三.语句规范3.1 语句总则3.2 循环语句3.3 Switc…

windows rabbitMq安装

一、Erlang 环境准备 下载安装包 跟我们跑java项目&#xff0c;要装jdk类似。rabbitMQ是基于Erlang开发的&#xff0c;因此安装rabbitMQ服务器之前&#xff0c;需要先安装Erlang环境。 官网直接下载windows直装版本&#xff1a;https://www.erlang.org/downloads 无脑安装&a…

【CGALDotNet】CGAL的C#封装(C#调用编译好的CGAL的dll)

介绍 开源项目出处&#xff08;两个模块&#xff09;&#xff1a; 链接1&#xff1a;https://github.com/Scrawk/CGALDotNet/tree/master?tabreadme-ov-file 链接2&#xff1a;https://github.com/Scrawk/CGALDotNetGeometry 该项目提供了编译的、封装相关接口后的CGAL库&am…

C语言 | Leetcode C语言题解之第62题不同路径

题目&#xff1a; 题解&#xff1a; int uniquePaths(int m, int n) {long long ans 1;for (int x n, y 1; y < m; x, y) {ans ans * x / y;}return ans; }

“Unite“ > MacOS下很不错的网站转应用App的工具

前言 前不久在浏览mac论坛&#xff0c;无意了解到一款非常好的工具&#xff0c;可以将网站转换为app&#xff0c;考虑到我们现在的主要应用都从本地客户端转成web形式使用&#xff0c;但基于本能的使用习惯&#xff0c;还是希望有个快捷的访问信息&#xff0c;这个应用非常适合…

万兆以太网MAC设计(11)完整UDP协议栈仿真

文章目录 前言一、模块接口二、IP模块与ARP模块之间的联系三、整体协议栈仿真总结&#xff1a; 前言 目前除了巨帧处理逻辑之外&#xff0c;所有的准备工作都已经结束了&#xff0c;先进行整体的功能验证。 一、模块接口 所有模块接口皆采用AXIS数据流的形式&#xff0c;其中…