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

【脚踢数据结构】队列(顺序和链式)

  • (꒪ꇴ꒪ ),Hello我是祐言QAQ
  • 我的博客主页:C/C++语言,Linux基础,ARM开发板,软件配置等领域博主🌍
  • 快上🚘,一起学习,让我们成为一个强大的攻城狮!
  • 送给自己和读者的一句鸡汤🤔:集中起来的意志可以击穿顽石!
  • 作者水平很有限,如果发现错误,可在评论区指正,感谢🙏


        在我们的日常生活中,队列是一个非常常见的现象。无论是在商店结账,还是在公交站等车,我们都在使用队列。在计算机科学中,队列也是一个重要的数据结构,用于处理和组织数据。在这篇文章中,我们将详细探讨队列的定义、操作、以及如何用C语言实现队列。

一、队列的定义


        队列(Queue)是一种特殊类型的线性数据结构,它遵循特定的操作规则,即遵循“先进先出”(FIFO,First-In-First-Out)原则。这意味着在队列中,首先加入的元素将会首先被移除,最后加入的元素将会最后被移除。

         当我们想存入1时,先移动front(队头)然后再写入数据1,拿数据也是一样,但务必保证先移动rear(队尾),再拿出数据,否则将会错位导致出错。

二、顺序队列

      1.  队列结构体定义


        首先需要定义一个顺序队列,我们可以使用结构体来定义一个队列,它包含一个数组(用于存储队列的数据)和三个整数(用于表示队列长度、队首和队尾的位置)。


typedef int Datatype;//队列的结构体定义
typedef struct Quene
{Datatype *q;	//用来存放队列的数据int size;		//队列的长度int front;		//队头int rear;		//队尾
}queue;

    2.  初始化队列


        接下来,我们需要初始化队列。在初始化时,我们将队首和队尾都设置为0,表示队列为空。

//初始化一个队列
queue *init_queue(int size)
{queue *que = malloc(sizeof(queue));if (que!=NULL){que->q = calloc(size, sizeof(Datatype));que->size = size;que->front = 0;que->rear = 0;}return que;
}

    3.  队空和队满


        如果我们想要实现入队和出队操作,我们需要先考虑队列可能会溢出或下溢的情况,因此我们需要判断是否队空或队满。

//队空判断
bool isempty_queue(queue *q)
{return (q->rear == q->front);
}//队满判断
bool isfull_queue(queue *q)
{return ((q->rear+1)%q->size == q->front);
}

    4.  入队和出队

//入队
bool en_queue(queue *que, Datatype data)
{if (isfull_queue(que)){return false;}//先挪rearque->rear = (que->rear+1)%(que->size);//再入数据que->q[que->rear] = data;return true;
}//出队
bool de_queue(queue *que, Datatype *data)
{if (isempty_queue(que)){return false;}//先挪frontque->front = (que->front+1)%(que->size);//再取数据*data = que->q[que->front];return true;
}


        队列是计算机科学中的一个基础概念,它在许多场景中都有应用,如操作系统的任务调度,网络的数据包处理等。理解队列的工作原理并能够实现队列,对于学习和理解计算机科学的其他概念是非常有帮助的。希望这篇文章能帮助你理解和实现队列。

        下面是一个简单的顺序队列举例,实现:输入正整数,添加员工信息,入队,用这个正整数表示员工号;输入负整数,出队(队首),显示该员工的所有信息;否则就退出。

        员工信息:工号、姓名、工资

        完整源码:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>#define SIZE 1024
typedef struct people
{int number;		//工号char name[20];	//姓名int money;		//工资
}Datatype;//队列的结构体定义
typedef struct Quene
{Datatype *q;	//用来存放队列的数据int size;		//队列的长度int front;		//队头int rear;		//队尾
}queue;//初始化一个队列
queue *init_queue(int size)
{queue *que = malloc(sizeof(queue));if (que!=NULL){que->q = calloc(size, sizeof(Datatype));que->size = size;que->front = 0;que->rear = 0;}return que;
}//队空判断
bool isempty_queue(queue *q)
{return (q->rear == q->front);
}//队满判断
bool isfull_queue(queue *q)
{return ((q->rear+1)%q->size == q->front);
}//入队
bool en_queue(queue *que, Datatype data)
{if (isfull_queue(que)){return false;}//先挪rearque->rear = (que->rear+1)%(que->size);//再入数据que->q[que->rear] = data;return true;
}//出队
bool de_queue(queue *que, Datatype *data)
{if (isempty_queue(que)){return false;}//先挪frontque->front = (que->front+1)%(que->size);//再取数据*data = que->q[que->front];return true;
}// 添加信息
void init_info(Datatype *data,int n)
{data->number = n;printf("请输入工人信息\n");while(getchar() != '\n');printf("姓名:");scanf("%s", data->name);printf("工资:");scanf("%d", &data->money);
}int main(int argc, char const *argv[]) {queue *q = init_queue(SIZE);int n;Datatype data;while (1) {printf("请输入一个正整数或负数\n");scanf("%d", &n);if (n > 0){init_info(&data, n);en_queue(q, data);continue;}else if(n < 0){Datatype d;if (de_queue(q, &d)) {printf("工号:%d,姓名:%s,工资:%d\n", d.number, d.name, d.money);} else {printf("队列已空,无法出队。\n");}}else{return -1;}}free(q->q);free(q);return 0;
}

三、链式队列

        链式队列(Linked Queue)是一种使用链表来实现的队列数据结构。与顺序队列不同,链式队列的元素并不直接存储在数组中,而是通过链表节点来连接。

        并且 由于使用链表实现,链式队列的大小可以根据需要动态分配和释放内存,避免了固定数组大小可能带来的限制。因此就没有是否队满问题

1.结构体定义

typedef int Datatype;typedef struct Node
{Datatype data;struct Node *next;
}node;typedef struct List_queue
{node *rear;		//队尾指针node *front;	//队头指针int size;		//链式队列的长度(实际的元素的个数)
}L_q;

2.创建新节点和判断队空

//创建新节点
node *create_node(Datatype data)
{node *new = malloc(sizeof(node));if (new != NULL){new->data = data;new->next = NULL;}return new;
}
//链式队列是否为空
bool isempty_list_queue(L_q *q)
{return (q->size == 0);
}

3.初始化队列

//初始化链式队列
L_q *init_list_queue()
{L_q *q = malloc(sizeof(L_q));if (q!=NULL){q->rear = NULL;q->front = NULL;q->size = 0;}return q;
}

3.入队

        入队操作在链表的末尾添加一个新节点,同时更新队尾指针。

//入队
bool en_list_queue(L_q *q, Datatype data)
{//先要将数据创建新节点node *new = create_node(data);if (new==NULL){return false;}//如果是第一次入队,new节点既是队尾,也是队头if (isempty_list_queue(q)){q->rear = new;q->front = new;}else    //不是第一次入队{//先将尾部节点的next指向new节点q->rear->next = new;//尾部节点要变成新节点newq->rear = new;}//队的元素个数要+1q->size++;return true;
}

4.出队

         出队操作移除链表的第一个节点,同时更新队头指针。

//出队
bool de_list_queue(L_q *q, Datatype *data)
{if (isempty_list_queue(q)){return false;}else if(q->size == 1)//只有一个数据的时候{q->rear = NULL;}//在链表不为空的情况下,先拿队头的数据*data = q->front->data;//将队头指向下一个节点q->front = q->front->next;//链式队列的元素个数-1q->size--;return true;
}

 5.遍历

//遍历
void display(L_q *q)
{if (q->front == NULL){return ;}node *p = q->front;while(p->next != NULL){printf("%d ", p->data);p = p->next;}printf("%d\n", p->data);
}

        简单示例:当我们输入正数时,入队并遍历整个队列;当我们输入负数时,出队一个元素,并再次遍历队列;输入0时退出。

int main(int argc, char const *argv[])
{L_q *q = init_list_queue();int num;Datatype data;while(1){scanf("%d", &num);if(num > 0){en_list_queue(q, num);	display(q);	}else if(num < 0){de_list_queue(q, &data);display(q);	}else{break;}}return 0;
}

四、结语

        
        队列作为一种基本的数据结构,在我们的编程生涯中扮演着重要的角色。希望这篇文章提供了一个清晰、详细的队列概述,帮助你理解队列的基本概念和操作,以及如何用C语言实现队列。

        选择顺序队列还是链式队列取决于实际应用的需求。如果你需要一个固定大小的队列,可以考虑使用顺序队列。如果你希望队列大小能够根据需要进行动态调整,那么链式队列更适合。在大多数情况下,链式队列具有更好的扩展性和灵活性。

        更多C语言Linux系统ARM板实战数据结构相关文章,关注专栏:

   手撕C语言

            玩转linux

                    脚踢数据结构

                            6818(ARM)开发板实战

📢写在最后

  • 今天的分享就到这啦~
  • 觉得博主写的还不错的烦劳 一键三连喔~
  • 🎉感谢关注🎉

相关文章:

【脚踢数据结构】队列(顺序和链式)

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言,Linux基础,ARM开发板&#xff0c;软件配置等领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff01;送给自己和读者的一句鸡汤&#x1f914;&…...

linux添加磁盘

一、linux虚拟机添加一块新的硬盘 四步&#xff1a; &#xff08;1&#xff09; &#xff08;2&#xff09;为硬盘进行分区 &#xff08;3&#xff09;初始化硬盘分区 &#xff08;4&#xff09;挂载 在虚拟机上添加一块硬盘 (1)、 虚拟机添加一块新的硬盘作为数据盘 (2) ls…...

图片懒加载

什么是图片懒加载&#xff1f; 懒加载也叫做延迟加载、按需加载&#xff0c;指的是在长网页中延迟加载图片 数据&#xff0c;是一种较好的网页性能优化的方式。在比较长的网页或应用中&#xff0c; 如果图片很多&#xff0c;所有的图片都被加载出来&#xff0c;而用户只能看到可…...

scope,deep穿透的实际应用

一.父组件代码 <template><div id"app"><h1 class"box"><pageName> </pageName></h1></div> </template><script> import pageName from "../src/components/pageName.vue"; export de…...

Multipass虚拟机设置局域网固定IP同时实现快速openshell的链接

本文只介绍在windows下实现的过程&#xff0c;Ubuntu采用22.04 安装multipass后&#xff0c;在卓面右下角Open shell 就可以链接默认实例Primary&#xff0c;当然如果你有多个虚拟机&#xff0c;可以针对不同内容单独建立终端的链接&#xff0c;而本文仅仅用Primary来说明。 …...

Webpack5 core-js和babel-loader区别和用法

文章目录 core-js是什么&#xff0c;有什么用&#xff1f;为什么使用了babel-loader对js进行兼容性配置还需要core-js?core-js的具体用法总结 core-js是什么&#xff0c;有什么用&#xff1f; core-js是一个流行的JavaScript库&#xff0c;它提供了对新的JavaScript特性、API…...

软考高级架构师——5、系统规划分析与设计方法

系统计划主要用于描述从项目提出、选择到确立的过程&#xff0c;包括系统项目的提出与可行性 分析&#xff0c;系统方案的制订、评价和改进&#xff0c;新旧系统的分析和比较&#xff0c;以及现有软件、硬件和数据 资源的有效利用等问题。 1、项目的提出与选择 项目的立项目标…...

区块链学习6-长安链部署:如何创建特定共识节点数和同步节点数的链

正常prepare的时候只支持4 7 13 16个节点个数&#xff0c;想要创建10个节点&#xff0c;其中5个是共识节点&#xff0c;如何实现&#xff1f; 1. 注释掉prepare.sh的这几行&#xff1a; 2. 修改 crytogen的模板文件&#xff1a; 如果是cert模式&#xff1a;chainmaker-crypt…...

北航基于openEuler构建工业机器人操作系统,打造“开箱即用”的机器人基础软件平台

北京航空航天大学是国家“双一流”建设高校&#xff0c;以建设扎根中国大地的世界一流大学为发展目标。北京航空航天大学在机器人领域一直处于行业前沿&#xff0c;以其亮眼的成果和优秀的师资力量&#xff0c;成为国内机器人领域的重要参与者和建设者。机器人操作系统是机器人…...

孤儿进程与僵尸进程

进程退出 关于进程退出有两个函数 exit和 _exit&#xff1a;其主要差别是在于是否直接退出。 其流程主要区别如下&#xff1a; 孤儿进程&#xff08;不存在危害&#xff09; 父进程运行结束&#xff0c;但子进程还在运行&#xff08;未运行结束&#xff09;&#xff0c;这…...

redis的基础命令01

1、操作库的指令 1、清除当前库---flushdb 2、清除所有库---flushAll 2、操作key的指令 最常用的指令get、set 1&#xff09;set key value 2&#xff09;get key 基础指令 1、del 删除单个&#xff1a;del key 、批量删除&#xff1a;del key1 key2 key3 2、exists 判断key是否…...

批量将excel文件合并

要批量合并多个Excel文件&#xff0c;可以按照以下步骤进行操作&#xff1a; 1. 导入所需的Python库&#xff1a;首先&#xff0c;您需要导入pandas库来处理Excel文件。 import pandas as pd 2. 定义文件路径和输出文件名称&#xff1a; input_folder "your_input_fo…...

关于Vue与服务器端的通信:如何实现登录鉴权

随着前后端分离开发模式的流行&#xff0c;Vue作为一种轻量级的JavaScript框架&#xff0c;被广泛用于前端开发。Vue可以与服务器进行通信来获取数据和进行鉴权&#xff0c;本文将探讨如何实现登录鉴权的过程&#xff0c;并给出相应的代码示例。 一、前端登录请求的发送与接收…...

GrapeCity Documents for Excel, .NET Crack

GrapeCity Documents for Excel, .NET 增加了对双面打印的支持。 GcExcel.NET支持PrintOutOptions类中的Duplex枚举&#xff0c;以启用/禁用页面上的双面打印。 枚举中有四个选项&#xff0c;用户可以相应地使用它们来打印工作簿&#xff1a; 双面打印。Default表示打印机的默认…...

wordpress网站Ajax留言评论+自定义评论字段

前端代码&#xff0c;下面的电话&#xff0c;公司&#xff0c;为自定义字段。 <form method"post" id"commentform" class"comment-form shansubmit" ><lable>用户</lable><input id"author" type"text&qu…...

AJAX-笔记(持续更新中)

文章目录 Day1 Ajax入门1.AJAX概念和axios的使用2. 认识URL3.URL的查询参数4.常用的请求方法和数据提交5.HTTP协议-报文6.接口文档7.form-serialize插件8.案例用户登录 Day2 Ajax综合案bootstrap弹框图书管理图片上传更换背景个人信息设置 Day3 AJAX原理XMLHttpRequestPromise封…...

模板复用和文章详情页(Go搭建qiucode.cn 之七)

模板复用其实就是动态内容驱动着部分变化的区域,公共区域是整个网站页面都在共用的内容,这便是模板复用的妙处。 模板复用 作为服务端编程语言的Golang,在web模板渲染引擎上当然也不逊色于其他同类型的服务端语言,它同样也有属于自己的那一套模板渲染引擎。 更为确切的叫…...

Android 使用SQLite的案例详解

1、说明 sqlite是个轻量级的数据库,可用于嵌入式。有时候做本地的web开发的时候,我会把sqlite作为内置数据库,这样便于部署,直接启动应用即可。 这里主要是将android中的使用过程记录一下。主要包含,数据如何初始化,在不同的activity中如何使用,以及增删改查的实现。 …...

linux 命令--查看网络端口命令

使用 netstat 检查端口 netstat 是一个命令行工具&#xff0c;可以提供有关网络连接的信息。 netstat - atulnp会显示所有端口和所有对应的程序&#xff0c;用grep管道可以过滤出想要的字段 -a &#xff1a;all&#xff0c;表示列出所有的连接&#xff0c;服务监听&#xff…...

python一个请求chatgpt3.5模型例子

当然可以&#xff01;你可以使用OpenAI的 openai.ChatCompletion.create() 方法来请求 ChatGPT 3.5 模型的回复。以下是一个使用Python进行请求的示例代码&#xff1a; python import openai# 设置OpenAI API的访问密钥 openai.api_key YOUR_API_KEY# 发送请求给ChatGPT模型 …...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来&#xff0c;在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂&#xff0c;网络攻击、数据泄露等事件频发&#xff0c;现行法律已难以完全适应新的风险挑战。 2025年3月28日&#xff0c;国家网信办会同相关部门起草了《网络安全…...