C语言数据结构之队列

目录

    • 1.队列的概念及结构
    • 2.队列的实现逻辑
    • 3.队列的代码实现
    • 4.相关例题
      • 选择题

在这里插入图片描述
•͈ᴗ•͈ 个人主页:御翮
•͈ᴗ•͈ 个人专栏:C语言数据结构
•͈ᴗ•͈ 欢迎大家关注和订阅!!!

在这里插入图片描述

1.队列的概念及结构

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

与栈不同的是,队列的出栈顺序是先入先出,就像我们出火车站,先排队的人排在前面,就先出站(插队不算奥,队列不可以插队,要做守规则的宝宝)

在这里插入图片描述

2.队列的实现逻辑

和栈一样,队列也可以用顺序表和链表来实现,但是我们要实现出队列,就相当于要实现头删数据的操作,对顺序表来说头删一个数据需要把后面的每一个数据都往前移动,消耗太大了,而对于链表而言只需要操作一个节点,比较简单,所以我们选择使用链表来实现队列

在这里插入图片描述

关于队列,我们要实现以下几个函数接口:

  • 初始化队列
void Init_Queue(Queue* ptr);

  • 打印队列里面的数据
void Print_Queue(Queue* ptr);

  • 数据入队列
void Push_Queue(Queue* ptr, QDatatype val);

  • 数据出队列
void Pop_Queue(Queue* ptr);

  • 获取队头的数据
QDatatype Queue_Front(Queue* ptr);

  • 获取队尾的数据
QDatatype Queue_Back(Queue* ptr);

  • 获取队列储存的元素个数
int Queue_Size(Queue* ptr);

  • 判断队列是否为空
int Check_Empty(Queue* ptr);

  • 销毁队列
void Destroy_Queue(Queue* ptr);

3.队列的代码实现

我们将代码分为 test.cQueue.cQueue.h 三个文件进行实现,可以更加方便操作,也可以避免代码全放在一个文件中显得冗余。


test.c

菜单选择和功能测试
#include "Queue.h"void menu()
{printf("******************************************\n");printf("***************   请选择   ***************\n");printf("******  1.PushQueue    2.PopQueue   ******\n");printf("******  3.Print        4.QueueFront ******\n");printf("******  5.QueueBack    6.QueueSize  ******\n");printf("******  7.CheckEmpty   0.Exit       ******\n");printf("******************************************\n");
}int main()
{int input = 0;QDatatype value = 0;Queue que;Init_Queue(&que);do{menu();scanf("%d", &input);switch (input){case 1:printf("请输入你要入队的值>:");scanf("%d", &value);Push_Queue(&que, value);break;case 2:Pop_Queue(&que);break;case 3:Print_Queue(&que);break;case 4:if (que.head == NULL){printf("队列为空\n");break;}printf("队列头部元素为%d\n", Queue_Front(&que));break;case 5:if (que.tail == NULL){printf("队列为空\n");break;}printf("队列尾部元素为%d\n", Queue_Back(&que));break;case 6:printf("队列中有效元素的个数为%d\n", Queue_Size(&que));break;case 7:if (Check_Empty(&que))printf("队列为空\n");elseprintf("队列不为空\n");break;case 0:Destroy_Queue(&que);printf("队列销毁成功\n");break;default:printf("选择错误,请重新选择\n");break;}} while (input);return 0;
}

Queue.c

函数接口实现
#include "Queue.h"//初始化队列
void Init_Queue(Queue* ptr)
{assert(ptr); // ptr要解引用,不能为空指针ptr->head = ptr->tail = NULL;
}//销毁队列
void Destroy_Queue(Queue* ptr)
{assert(ptr); // ptr要解引用,不能为空指针QNode* cur = ptr->head;while (ptr->head != NULL){cur = ptr->head;ptr->head = ptr->head->next;free(cur);}ptr->tail = NULL; // 所有空间释放完后尾指针要置空,不然就是野指针
}//开辟新节点
QNode* Buy_Node()
{QNode* tmp = (QNode*)malloc(sizeof(QNode));return tmp;
}//打印队列里面的数据
void Print_Queue(Queue* ptr)
{assert(ptr); // ptr要解引用,不能为空指针QNode* cur = ptr->head;while (cur != NULL){printf("%d ", cur->data);cur = cur->next;}printf("\n");
}//数据入队列
void Push_Queue(Queue* ptr,QDatatype val)
{assert(ptr); // ptr要解引用,不能为空指针QNode* newnode = Buy_Node();if (newnode == NULL) // 可能开辟空间失败,失败会返回NULL,则终止后面的程序{perror("Push_Queue\n");exit(1);}newnode->data = val; // 新节点要初始化好,把要储存的值赋进去newnode->next = NULL;if (ptr->head == NULL) //当队列为空时,头节点和尾节点都要赋值{ptr->head = ptr->tail = newnode;}else{ptr->tail->next = newnode;ptr->tail = newnode;}
}//获取队列储存的元素个数
int Queue_Size(Queue* ptr)
{assert(ptr); // ptr要解引用,不能为空指针int count = 0;QNode* cur = ptr->head;while (cur != NULL){cur = cur->next;count++;}return count;
}//数据出队列
void Pop_Queue(Queue* ptr)
{assert(ptr); // ptr要解引用,不能为空指针if (ptr->head == NULL){printf("队列中没有元素\n");return;}if (Queue_Size(ptr) == 1){free(ptr->tail);//如果删完了但是没有将tail置为NULL,则case 5 会发生错误,显示队尾元素随机值。ptr->tail = NULL;ptr->head = NULL;return;}QNode* pop = ptr->head;ptr->head = ptr->head->next;free(pop);
}//获取队头的数据
QDatatype Queue_Front(Queue* ptr)
{assert(ptr); // ptr要解引用,不能为空指针return ptr->head->data;
}//获取队尾的数据
QDatatype Queue_Back(Queue* ptr)
{assert(ptr); // ptr要解引用,不能为空指针return ptr->tail->data;
}//判断队列是否为空
int Check_Empty(Queue* ptr)
{assert(ptr); // ptr要解引用,不能为空指针if (Queue_Size(ptr))return 0;elsereturn 1;
}

Queue.h

队列的定义和函数接口的声明
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <errno.h>typedef int QDatatype;  // 队列储存的数据类型typedef struct QNode
{struct QNode* next; // 指向下一个节点QDatatype data;		// 节点储存的数据
}QNode;typedef struct Queue
{QNode* head;		//指向队列的第一个节点QNode* tail;		//指向队列的最后一个节点
}Queue;//初始化队列
void Init_Queue(Queue* ptr);//打印队列里面的数据
void Print_Queue(Queue* ptr);//数据入队列
void Push_Queue(Queue* ptr, QDatatype val);//数据出队列
void Pop_Queue(Queue* ptr);//获取队头的数据
QDatatype Queue_Front(Queue* ptr);//获取队尾的数据
QDatatype Queue_Back(Queue* ptr);//获取队列储存的元素个数
int Queue_Size(Queue* ptr);//判断队列是否为空
int Check_Empty(Queue* ptr);//销毁队列
void Destroy_Queue(Queue* ptr);

另外扩展了解一下,实际中我们有时还会使用一种队列叫循环队列。如操作系统课程讲解生产者消费者模型时可以就会使用循环队列。环形队列可以使用数组实现,也可以使用循环链表实现(链表实现要更简单一点),在下一篇博客中讲解一下。

在这里插入图片描述

4.相关例题

选择题

1.以下( )不是队列的基本运算?
A 从队尾插入一个新元素
B 从队列中删除第i个元素
C 判断一个队列是否为空
D 读取队头元素的值
答案:B
解析:队列只能从队头删除元素,因为它的特性是先入先出。

2.下列关于队列的叙述错误的是( )
A.队列可以使用链表实现
B.队列是一种“先入先出”的数据结构
C.数据出队列时一定只影响尾指针
D.数据入队列时一定从尾部插入
答案:C
解析:出队操作,一定会影响头指针,因为出队是删除队头元素,如果出队时队列只有一个元素,会影响头指针也会影响尾指针。

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

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

相关文章

【Flask 系统教程 2】路由的使用

Flask 是一个轻量级的 Python Web 框架&#xff0c;其简洁的设计使得构建 Web 应用变得轻而易举。其中&#xff0c;路由是 Flask 中至关重要的一部分&#xff0c;它定义了 URL 与视图函数之间的映射关系&#xff0c;决定了用户请求的处理方式。在本文中&#xff0c;我们将深入探…

C++关联容器1——map,multimap,set,multiset介绍,pair类型

目录 关联容器 使用关联容器 使用map 使用set 关联容器概述 定义关联容器 初始化multimap或multiset 关键字类型的要求 有序容器的关键字类型 使用关键字类型的比较函数 pair 类型 创建pair 对象的函数 关联容器 关联容器支持高效的关键字查找和访问。 两个主要的关…

【阿里云服务器】ubuntu 22.04.1安装docker以及部署java环境

我的服务器配置是2GB CPU 2GB 内存 Ubuntu22.04 目录 一、阿里云 ubuntu 22.04.1安装docker 二、docker基础命令 三、Windows电脑访问云服务器 四、安装java环境 安装OpenJDK 8&#xff08;可以根据需要安装其他版本的JDK&#xff09; 安装java的依赖管理工具maven 一、…

Java | Spring框架 | BeanFactory与ApplicationContext

Spring容器&#xff1a;BeanFactory与ApplicationContext Spring容器是Spring框架的核心&#xff0c;负责实例化、配置和组装Bean。 Spring容器有两种主要类型&#xff1a;BeanFactory和ApplicationContext。 一、BeanFactory 基本功能&#xff1a;BeanFactory是Spring框架…

Web Storage 笔记12 操作购物车

相关内容&#xff1a;购物车实例 WebStorage存储空间足够大&#xff0c;访问都在客户端(Client)完成。有些客户端先处理或检查数据&#xff0c;就可以直接使用WebStorage进行存储&#xff0c;不仅可以提高访问速度&#xff0c;还可以降低服务器的练习。负担。例如&#xff0c;购…

vue设置必填项

表单&#xff1a; <el-form-item label"标题" prop"title" ><el-input placeholder"标题" v-model"form.title"></el-input></el-form-item> 在data中添加一个rules来规定 rules: {title: [{ required: t…

webpack打包后index.html引用文件地址问题

在前端开发中&#xff0c;src 属性指定的相对路径是相对于当前 HTML 文件的路径&#xff0c;而不是相对于网站的根目录。这种相对路径的解析方式是浏览器的行为。 当浏览器解析 HTML 文件中的 <script> 标签时&#xff0c;它会根据相对路径来构建请求 URL。如果你在 HTM…

刷机维修进阶教程-----魅族机型更改参数 修复基带 操作步骤解析

前面几篇博文简单解析了下小米 vivo oppo等机型修复基带与更改参数的一些步骤。对于高通芯片来说。明白其原理。一通百通。最近有粉丝私信询问一键新机有关事宜。在与一些工作室合作中发现。一些过项目具体检测的要区别对待。有的只需要修改型号即可方便跳过项目的校验机制, …

DiffSeg——基于Stable Diffusion的无监督零样本图像分割

概述 基于计算机视觉的模型的核心挑战之一是生成高质量的分割掩模。大规模监督训练的最新进展已经实现了跨各种图像风格的零样本分割。此外&#xff0c;无监督训练简化了分割&#xff0c;无需大量注释。尽管取得了这些进展&#xff0c;构建一个能够在没有注释的零样本设置中分…

带文字海报流程自动化

上一篇文章&#xff1a; 带文字海报流程自动化 - 知乎 项目代码整理在&#xff1a; https://github.com/liangwq/Chatglm_lora_multi-gpu​github.com/liangwq/Chatglm_lora_multi-gpu 根据用户的输入生成图片prompt模块代码封装&#xff1a; from openai import OpenAI im…

【无标题】vue webrtc 播放rtsp视频流

最近有个小活其中有涉及播放大华及海康摄像头视频流的需求&#xff0c;经调查发现可以使用webrtc来实现相关功能&#xff0c;记录一下&#xff0c;步骤如下&#xff1a; &#xff11;、下载webrtc &#xff1a;Releases mpromonet/webrtc-streamer GitHub winows下下载&…

华为机考入门python3--(22)牛客22- 汽水瓶

分类&#xff1a;数字 知识点&#xff1a; 整除符号// 5//3 1 取余符号% 5%3 2 题目来自【牛客】 import sysdef calc_soda_bottles(n):if n 0: # 结束输入&#xff0c;不进行处理returnelse:# 循环进行汽水换算total_drunk 0 # 记录总共喝了多少瓶汽水while…

永不过期的SSL/TLS证书解决方案

前提: cloudflare API 密钥宝塔面板安装了nginx 如果你不使用宝塔面板,可以参照脚本修改 生成证书脚本 curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/ssl_pro.sh && chmod x ssl_pro.sh && ./ssl_pro.sh使用方法: https://blo…

城市反无人机技术

一、城市环境下反无人机难点 1) 城市建筑密级遮挡严重 城市中建筑物密集&#xff0c;通视条件差。设备若部署于地面&#xff0c;受限于建筑物遮挡&#xff0c;探测和处置距离有限。因此&#xff0c;通常采用将设备部署于建筑物楼顶的方式应对无人机威胁。此种方式对于飞行在楼…

Windows系统如何切换32位和64位Python

1.简介 由于需要编译32位的程序&#xff0c;默认已经安装了Anaconda和Pycharm&#xff0c;虚拟环境使用的是64位Python&#xff0c;现在需要使用32位Python开发32位的软件程序。 2.操作过程 2.1查询自己的conda是32位还是64位 打开 Anaconda 命令提示符或任何命令行界面&am…

golang使用DoH解析域名

按照RFC 8484 规范&#xff0c;DoH服务器支持GET或POST两种方式。 当使用GET方法&#xff0c;唯一的变量"dns"被赋值为base64url编码的DNS请求内容。 These examples use a DoH service with a URI Template of"https://dnsserver.example.net/dns-query{?dns}…

USP技术提升大语言模型的零样本学习能力

大语言模型&#xff08;LLMs&#xff09;在零样本和少样本学习能力上取得了显著进展&#xff0c;这通常通过上下文学习&#xff08;in-context learning, ICL&#xff09;和提示&#xff08;prompting&#xff09;来实现。然而&#xff0c;零样本性能通常较弱&#xff0c;因为缺…

【数据结构(邓俊辉)学习笔记】列表03——有序列表

文章目录 0. 概述1. 唯一化2. 查找2.1 实现2.2 顺序查找2.3 复杂度 0. 概述 介绍下有序列表。 若列表中所有节点的逻辑次序与其大小次序完全一致&#xff0c;则称作有序列表&#xff08;sorted list&#xff09;。为保证节点之间可以定义次序&#xff0c;依然假定元素类型T直接…

WebAssembly 入门教程 c++、python编译wasm

WebAssembly 入门 了解 wasm 使用场景&#xff0c;复杂对象传递和经验法则。 简介 WebAssembly 是一种新的编码方式&#xff0c;可以在现代的网络浏览器中运行。它是一种低级的类汇编语言&#xff0c;具有紧凑的二进制格式&#xff0c;可以接近原生的性能运行&#xff0c;并…

AI大模型探索之路-训练篇13:大语言模型Transformer库-Evaluate组件实践

系列篇章&#x1f4a5; AI大模型探索之路-训练篇1&#xff1a;大语言模型微调基础认知 AI大模型探索之路-训练篇2&#xff1a;大语言模型预训练基础认知 AI大模型探索之路-训练篇3&#xff1a;大语言模型全景解读 AI大模型探索之路-训练篇4&#xff1a;大语言模型训练数据集概…