当前位置: 首页 > news >正文

C语言实现队列--数据结构

在这里插入图片描述
请添加图片描述

😶‍🌫️Take your time ! 😶‍🌫️
💥个人主页:🔥🔥🔥大魔王🔥🔥🔥
💥代码仓库:🔥🔥魔王修炼之路🔥🔥
💥所属专栏:🔥魔王的修炼之路–数据结构🔥
如果你觉得这篇文章对你有帮助,请在文章结尾处留下你的点赞👍和关注💖,支持一下博主。同时记得收藏✨这篇文章,方便以后重新阅读。


文章目录

  • 前言
  • 代码实现
    • 1、创建结构体
    • 2、初始化结构体
    • 3、销毁
    • 4、创建新结点
    • 5、入队列
    • 6、出队列
    • 7、队列成员个数
    • 8、队列是否为空
    • 9、队列最前面的元素数据
    • 10、队列最后面的元素数据
  • 总代码
    • Queue.h
    • Queue.c
    • Test.c
  • 总结

前言

队列介绍:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进后出FIFQ(First In First Out)入队列:进行插入操作的一端称为队尾。出队列:进行删除操作的一端称为队头。

在这里插入图片描述

代码实现

1、创建结构体

对于队列,需要创建两个结构体,第一个为结点的结构体,第二个是记录队列头、尾及元素个数的结构体,因为队列在入队时相当于尾插,如果不记录尾结点,需要一直遍历,这样效率低,所以在操作后直接记录尾结点,记录个数是因为方便其他函数操作,比如需要个数时,直接访问这个成员就行了,不需要再遍历一遍看看有几个,对于队列是否为空,也不需要判断指针是否为空,直接判断个数就行了。

代码实现:

#pragma once#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>typedef int QDataType;typedef struct QueueNode
{struct QueueNode* next;QDataType data;
}QNode;typedef struct Queue
{QNode* head;QNode* tail;int size;//目的:要个数时,不需要遍历一遍,直接就能知道有几个。
}Queue;

2、初始化结构体

刚开始时怎样创建?是创建一个结构体指针然后接收在函数里开辟一块空间返回的结构体指针还是直接创建一个结构体,我们这里选择直接创建一个结构体,因为这个不像单链表一样,如果单链表没有元素,那么就是空,就没有结点一说,这个直接就一定不是空,因为我们操作的不是结点的结构体,而是记录队列的结构体,所以它永远不会是空,就不需要弄一个结构体指针再接收之类的操作了。

void QInit(Queue* q)
{assert(q);q->head = q->tail = NULL;q->size = NULL;
}

3、销毁

用完就需要销毁,防止内存泄漏。

void QDestroy(Queue* q)
{assert(q);while (q->head){Queue* next = q->head->next;free(q->head);q->head = next;}q->tail = NULL;//防止野指针q->size = 0;
}

4、创建新结点

入队列时需要创建新结点。

QNode* BuyNewnode(QDataType x)
{QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL)//检测是否开辟成功{perror("malloc error");assert(newnode);}newnode->data = x;newnode->next = NULL;
}

5、入队列

就像最开始的那个图一样,入队列相当于尾插。

//从后面进入,算是尾插。
void QPush(Queue* q, QDataType x)
{assert(q);QNode* newnode = BuyNewnode(x);if (q->head == NULL)//如果本来没有元素,需要让首尾指针都赋上这个结点;如果有元素,就管尾指针就行。{assert(q->head == q->tail);q->head = q->tail = newnode;}else{q->tail->next = newnode;q->tail = newnode;}q->size++;
}

6、出队列

相当于头删。

//从前面出,算是头删。
void QPop(Queue* q)
{assert(q);assert(q->head && q->tail);//出队列时队列不能为空,如果不为空,那么首尾指针肯定都不为空。if (q->head->next == NULL)判断是否只有一个结点,如果只有一个,尾指针也要指向空,不然就会变成野指针。{assert()q->head==q->tail);//如果只有一个结点,那么首尾结点肯定相等。free(q->head);q->head = q->tail = NULL;}else{QNode* newhead = q->head->next;free(q->head);q->head = newhead;}q->size--;
}

7、队列成员个数

直接返回结构体里的size就行。

int QSize(Queue* q)
{assert(q);//int size = 0;//QNode* cur = q->head;//while (cur)//{//	cur = cur->next;//	size++;//}//return size;return q->size;
}

8、队列是否为空

直接判断size就行。

bool QEmpty(Queue* q)
{assert(q);return q->size == 0;
}

9、队列最前面的元素数据

需要判断是否为空。如果为空就不能访问,不然越界。

QDataType QFront(Queue* q)
{assert(q);assert(q->head);return q->head->data;
}

10、队列最后面的元素数据

需要判断队列是否为空,如果为空就不能访问,不然越界。

QDataType QBack(Queue* q)
{assert(q);assert(q->tail);return q->tail->data;
}

总代码

Queue.h

Queue.h

#pragma once#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>typedef int QDataType;typedef struct QueueNode
{struct QueueNode* next;QDataType data;
}QNode;typedef struct Queue
{QNode* head;QNode* tail;int size;//目的:要个数时,不需要遍历一遍,直接就能知道有几个。
}Queue;void QInit(Queue* q);void QDestroy(Queue* q);void QPush(Queue* q,QDataType x);void QPop(Queue* q);int QSize(Queue* q);bool QEmpty(Queue* q);QDataType QFront(Queue* q);QDataType QBack(Queue* q);

Queue.c

Queue.c

#define _CRT_SECURE_NO_WARNINGS 1#include "Queue.h"void QInit(Queue* q)
{assert(q);q->head = q->tail = NULL;q->size = NULL;
}void QDestroy(Queue* q)
{assert(q);while (q->head){Queue* next = q->head->next;free(q->head);q->head = next;}q->tail = NULL;//防止野指针q->size = 0;
}QNode* BuyNewnode(QDataType x)
{QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL)//检测是否开辟成功{perror("malloc error");assert(newnode);}newnode->data = x;newnode->next = NULL;
}//从后面进入,算是尾插。
void QPush(Queue* q, QDataType x)
{assert(q);QNode* newnode = BuyNewnode(x);if (q->head == NULL)//如果本来没有元素,需要让首尾指针都赋上这个结点;如果有元素,就管尾指针就行。{assert(q->head == q->tail);q->head = q->tail = newnode;}else{q->tail->next = newnode;q->tail = newnode;}q->size++;
}//从前面出,算是头删。
void QPop(Queue* q)
{assert(q);assert(q->head && q->tail);//出队列时队列不能为空,如果不为空,那么首尾指针肯定都不为空。if (q->head->next == NULL)//判断是否只有一个结点,如果只有一个,尾指针也要指向空,不然就会变成野指针。{assert(q->head == q->tail);//如果只有一个结点,那么首尾结点肯定相等。free(q->head);q->head = q->tail = NULL;}else{QNode* newhead = q->head->next;free(q->head);q->head = newhead;}q->size--;
}int QSize(Queue* q)
{assert(q);//int size = 0;//QNode* cur = q->head;//while (cur)//{//	cur = cur->next;//	size++;//}//return size;return q->size;
}bool QEmpty(Queue* q)
{assert(q);return q->size == 0;
}QDataType QFront(Queue* q)
{assert(q);assert(q->head);return q->head->data;
}QDataType QBack(Queue* q)
{assert(q);assert(q->tail);return q->tail->data;
}

Test.c

//测试队列
#define _CRT_SECURE_NO_WARNINGS 1#include "Queue.h"void print(Queue* q)
{while (!QEmpty(q)){printf("%d ", QFront(q));QPop(q);}
}int main()
{Queue q;QInit(&q);QPush(&q, 0);QPush(&q, 1);QPush(&q, 2);QPush(&q, 3);QPush(&q, 4);QPush(&q, 5);QPop(&q);QPop(&q);print(&q);QDestroy(&q);return 0;
}

总结

结尾

  • 博主长期更新,博主的目标是不断提升阅读体验和内容质量,如果你喜欢博主的文章,请点个赞或者关注博主支持一波,我会更加努力的为你呈现精彩的内容。

🌈专栏推荐
😈魔王的修炼之路–C语言
😈魔王的修炼之路–数据结构初阶
😈魔王的修炼之路–C++
😈魔王的修炼之路–Linux
更新不易,希望得到友友的三连支持一波。收藏这篇文章,意味着你将永久拥有它,无论何时何地,都可以立即找到重新阅读;关注博主,意味着无论何时何地,博主将永久和你一起学习进步,为你带来有价值的内容。

请添加图片描述

相关文章:

C语言实现队列--数据结构

&#x1f636;‍&#x1f32b;️Take your time ! &#x1f636;‍&#x1f32b;️ &#x1f4a5;个人主页&#xff1a;&#x1f525;&#x1f525;&#x1f525;大魔王&#x1f525;&#x1f525;&#x1f525; &#x1f4a5;代码仓库&#xff1a;&#x1f525;&#x1f525;魔…...

前端CSS经典面试题总结

前端CSS经典面试题总结 2.1 介绍一 下 CSS 的盒子模型&#xff1f;2.2 css 选择器优先级&#xff1f;2.3 垂直居中几种方式&#xff1f;2.4 简明说一下 CSS link 与 import 的区别和用法&#xff1f;2.5 rgba和opacity的透明效果有什么不同&#xff1f;2.6 display:none和visib…...

cookie、session、token的区别是什么

前言 今天就来说说session、cookie、token这三者之间的关系&#xff01;最近这仨玩意搞得头有点大&#x1f923; 1.为什么会有它们三个&#xff1f; 我们都知道 HTTP 协议是无状态的&#xff0c;所谓的无状态就是客户端每次想要与服务端通信&#xff0c;都必须重新与服务端链接…...

leetcode分类刷题 -- 前缀和和哈希

力扣 class Solution { public int subarraySum(int[] nums, int k) { Map<Integer,Integer> map new HashMap<>(); int count0,sum0; map.put(0,1); for(int i:nums){ sum i; if(map.containsKey(sum-k)) count map.get(sum-k); map.compute(sum,(key,v)->…...

浅谈作为程序员如何写好文档:了解读者

我作为从一名懵懂的实习生转变为工程师的工作经历中&#xff0c;伴随着技术经验的成长&#xff0c;也逐渐意识到了编写文档是知识和经验传递给其他人的最有效方式。通过文档&#xff0c;可以分享我的技术知识和最佳实践&#xff0c;使其他人更好地理解我的工作。在这里&#xf…...

一文读懂国内首本《牛客2023金融科技校园招聘白皮书》

金融科技人才作为金融数字化转型的关键支撑&#xff0c;但当下金融科技人才培养体系尚未形成&#xff0c;优秀的金融科技人才供不应求&#xff0c;目前存在严重的人才供给问题。 据调研数据统计&#xff0c;96.8%的金融机构存在金融科技人才缺口&#xff0c;54.8%的机构认为新…...

深度学习03-卷积神经网络(CNN)

简介 CNN&#xff0c;即卷积神经网络&#xff08;Convolutional Neural Network&#xff09;&#xff0c;是一种常用于图像和视频处理的深度学习模型。与传统神经网络相比&#xff0c;CNN 有着更好的处理图像和序列数据的能力&#xff0c;因为它能够自动学习图像中的特征&…...

你真正知道什么是品牌营销么?颠覆你旧有认知

什么是品牌营销&#xff0c;新时代也需要新时代的定义和诠释&#xff01; 尤其这次疫情加剧了行业竞争&#xff0c;让很多企业都开始重新重视品牌建设&#xff0c;以此实现对产品的价格保护&#xff0c;脱离同质化恶性竞争&#xff1b;提高品牌知名度&#xff0c;实现更高价值…...

pytorch 测量模型运行时间,GPU时间和CPU时间,model.eval()介绍

文章目录 1. 测量时间的方式2. model.eval(), model.train(), torch.no_grad()方法介绍2.1 model.train()和model.eval()2.2 model.eval()和torch.no_grad() 3. 模型推理时间方式4. 一个完整的测试模型推理时间的代码5. 参考&#xff1a; 1. 测量时间的方式 time.time() time.…...

十三、超时重试机制

目录 超时配置和重试机制 FeignClient 、Ribbon 、 Hystrix三个之间配置优先级的关系 配置常用属性 Ribbon超时和重试配置: Ribbon重试次数计算公式&#xff1a; FeignClient 超时配置&#xff1a; Hystrix超时配置&#xff1a; Hystrix超时计算公式&#xff1a; 超时配…...

JAVA常用API - Runtime和System

文章目录 前言 大家好,我是最爱吃兽奶,今天给大家带来JAVA常用API中的Runtime类和System类 那么就让我们一起去看看吧! 一、Rubtime 1.Rubtime是什么? 2.Runtime常用方法 Runtime提供了很多方法,在这里演示两个 public static Runtime getRuntime(): 返回当前运行时环境的…...

ANR实战案例 - FCM拉活启动优化

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 文章目录 系列文章目录前言一、Trace日志分析二、业务分析1.Firebase源码分析2.Firebase官方查看官方文档Dem…...

Kali-linux查看打开的端口

对一个大范围的网络或活跃的主机进行渗透测试&#xff0c;必须要了解这些主机上所打开的端口号。在Kali Linux中默认提供了Nmap和Zenmap两个扫描端口工具。为了访问目标系统中打开的TCP和UDP端口&#xff0c;本节将介绍Nmap和Zenmap工具的使用。 4.4.1 TCP端口扫描工具Nmap 使…...

判断浏览器是否支持webp图片

.WebP是谷歌主导的开放免费的网络图像格式&#xff0c;其核心编码来自VP8也就是同时支持WebP图片和WebM视频等。 这种图像格式追求的并不是无损画质&#xff0c;而是在有损画质的情况下尽可能的压缩图像体积但也尽量降低清晰度下降。 谷歌资助和发展该图像格式最主要的目的就是…...

【Qt编程之Widgets模块】-007:QTextStream类及QDataStream类

1 概述 QTextStream和QDataStream都是对流进行操作 QTextStream只能普通类型的流操作像QChar、QString、int…&#xff0c;其实就很类似我们c或者c中读写文件的感觉&#xff0c; QDataStream就厉害了&#xff0c;无论是QTextStream的普通类型的流操作还是一些特殊类型的流操作…...

js对map排序,后端返回有序的LinkedHashMap类型时前端获取后顺序依旧从小到大的解决方法

js对map排序&#xff0c;后端返回有序的LinkedHashMap类型时前端获取后顺序依旧从小到大的解决方法 js对map排序&#xff0c;后端返回有序的LinkedHashMap类型时前端获取后顺序依旧从小到大的解决方法 [{"2020": [{"id": 39,"createTime": &quo…...

JMX vs JFR:谁才是最强大的JVM监控利器?

大家好&#xff0c;我是小米&#xff01;今天我们来聊一聊JVM监控系统&#xff0c;特别是关于JMX和JFR的使用。你是否有过在线上应用出现性能问题时&#xff0c;无法准确获取关键指标的困扰呢&#xff1f;那么&#xff0c;不妨听听我给大家带来的解决方案。 什么是JMX 首先&a…...

Laravel Collection 基本使用

创建集合 为了创建一个集合&#xff0c;可以将一个数组传入集合的构造器中&#xff0c;也可以创建一个空的集合&#xff0c;然后把元素写到集合中。Laravel 有collect()助手&#xff0c;这是最简单的&#xff0c;新建集合的方法。 $collection collect([1, 2, 3]);默认情况下…...

JUC并发编程19 | 读写锁

有一些关于锁的面试题&#xff1a; 你知道 Java 里面有哪些锁&#xff1f;读写锁的饥饿问题是什么&#xff1f;有没有比读写锁更快的锁&#xff1f;StampedLock知道嘛&#xff1f;&#xff08;邮戳锁/票据锁&#xff09;ReentrantReadWriteLock 有锁降级机制&#xff1f; Ree…...

springboot_maven项目怎么引入mybatis

在pom.xml文件中添加mybatis和mybatis-spring-boot-starter的依赖 org.mybatis mybatis ${mybatis.version} org.mybatis.spring.boot mybatis-spring-boot-starter ${mybatis.spring.version} 配置mybatis 在application.properties&#xff08;或application.yml&#xff0…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...