C语言笔记38 •数据结构--队列•

数据结构--队列

1.队列的定义

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

2.队列的实现 

     队列也可以数组或链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构, 出队列在数组头上出数据,效率会比较低。

//队列本质就是一个链表

typedef int QDataType;
typedef struct QueueNode
{
    QDataType data;
    struct QueueNode* next;
}QNode;//定义队列中的节点

typedef struct Queue
{
    QNode* head;
    QNode* tail;
}Queue;//定义队列(头和尾节点地址封装在一个结构体中)

//队列的接口函数
void QueueInit(Queue* pq);//初始化队列

void QueueDestory(Queue* pq);//销毁队列

void PrintQueue(Queue* pq);//打印队列数据

QNode* Buynode(QDataType x);//申请节点

void QueuePush(Queue* pq, QDataType x);//队尾插入数据(队尾进)

void QueuePop(Queue* pq);//队头删除数据(队头出)

bool QueueEmpty(Queue* pq);//判断队列是否为空

size_t QueueSize(Queue* pq);//队列的长度

QDataType QueueFront(Queue* pq);//输出队头的数据值

QDataType QueueBack(Queue* pq);//输出队尾的数据值

//队列的基本实现#pragma once
#include <stdio.h> 
#include <stdlib.h> 
#include <assert.h> 
#include <stdbool.h> typedef int QDataType;
typedef struct QueueNode
{QDataType data;struct QueueNode* next;
}QNode;typedef struct Queue
{QNode* head;QNode* tail;
}Queue;void QueueInit(Queue* pq);//初始化队列void QueueDestory(Queue* pq);//销毁队列void PrintQueue(Queue* pq);//打印队列数据QNode* Buynode(QDataType x);//申请节点void QueuePush(Queue* pq, QDataType x);//队尾插入数据(队尾进)void QueuePop(Queue* pq);//队头删除数据(队头出)bool QueueEmpty(Queue* pq);//判断队列是否为空size_t QueueSize(Queue* pq);//队列的长度QDataType QueueFront(Queue* pq);//输出队头的数据值QDataType QueueBack(Queue* pq);//输出队尾的数据值//接口函数的实现void QueueInit(Queue* pq)//初始化队列
{assert(pq);pq->head = pq->tail = NULL;
}void QueueDestory(Queue* pq)//销毁队列
{assert(pq);QNode *cur= pq->head;while (cur){QNode* temp = cur->next;free(cur);cur = temp;}pq->head = pq->tail = NULL;
}void PrintQueue(Queue* pq)//打印队列数据
{assert(pq);QNode* cur = pq->head;while (cur){printf("%d ", cur->data);cur = cur->next;}printf("\n");
}
QNode* Buynode(QDataType x)//申请节点
{QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc fail");exit(1);}newnode->data = x;newnode->next = NULL;
}void QueuePush(Queue* pq, QDataType x)//队尾插入数据(队尾进)
{assert(pq);if (pq->head == NULL){pq->head = pq->tail = Buynode(x);}else{pq->tail->next = Buynode(x);pq->tail = pq->tail->next;}
}
void QueuePop(Queue* pq)//队头删除数据(队头出)
{assert(pq);if (pq->head == pq->tail){free(pq->head);pq->head = pq->tail=NULL;}else{QNode* temp = pq->head->next;free(pq->head);pq->head = temp;}
}
bool QueueEmpty(Queue* pq)//判断队列是否为空
{assert(pq);return pq->head == NULL;
}
size_t QueueSize(Queue* pq)//队列的长度
{assert(pq);size_t size = 0;QNode* cur = pq->head;while (cur){size++;cur = cur->next;}return size;
}
QDataType QueueFront(Queue* pq)//输出队头的数据值
{assert(pq);assert(pq->head);return pq->head->data;
}QDataType QueueBack(Queue* pq)//输出队尾的数据值
{assert(pq);assert(pq->tail);return pq->tail->data;
}//队列接口函数的测试void queue_test()
{Queue q;QueueInit(&q);//初始化队列QueuePush(&q, 1);//队尾插入数据(队尾进)进1QueuePush(&q, 2);//队尾插入数据(队尾进)进2QueuePush(&q, 3);//队尾插入数据(队尾进)进3PrintQueue(&q);//打印队列数据  1 2 3printf("队头值:%d\n", QueueFront(&q)); //输出队头的数据值printf("队尾值:%d\n", QueueBack(&q)); //输出队尾的数据值printf("队列的长度:%d\n", QueueSize(&q)); //队列的长度printf("队列状态:%s\n", QueueEmpty(&q) ? "True" : "False");//判断队列是否为空printf("=======================================\n");QueuePop(&q);//队头删除数据(队头出)出1PrintQueue(&q);//打印队列数据 2 3printf("队头值:%d\n", QueueFront(&q)); //输出队头的数据值printf("队尾值:%d\n", QueueBack(&q)); //输出队尾的数据值printf("队列的长度:%d\n", QueueSize(&q)); //队列的长度printf("队列状态:%s\n", QueueEmpty(&q) ? "True" : "False");//判断队列是否为空printf("=======================================\n");QueuePop(&q);//队头删除数据(队头出)出2PrintQueue(&q);//打印队列数据3printf("队头值:%d\n", QueueFront(&q)); //输出队头的数据值printf("队尾值:%d\n", QueueBack(&q)); //输出队尾的数据值printf("队列的长度:%d\n", QueueSize(&q)); //队列的长度printf("队列状态:%s\n", QueueEmpty(&q) ? "True" : "False");//判断队列是否为空printf("=======================================\n");QueuePop(&q);//队头删除数据(队头出)出3PrintQueue(&q);//打印队列数据 无数据printf("队列的长度:%d\n", QueueSize(&q)); //队列的长度printf("队列状态:%s\n", QueueEmpty(&q) ? "True" : "False");//判断队列是否为空QueueDestory(&q);//销毁队列
}int main()
{queue_test();return 0;
}

 

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

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

相关文章

Jmeter混合压测(2407)

一 压测需求&#xff1a; 电商作为服务端&#xff0c;至少需要满足并发量,QPS:100/s,TPS:20/s。例如场景&#xff1a; 电商交易中&#xff0c;商品图片请求量最多&#xff0c;电商服务端需要满足并发请求查询图片信息。各家可能会并发请求同一家电商商品、订单等内容。 二 压…

基于多种机器学习算法的短信垃圾分类模型

文章目录 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主导入第三方库读取数据数据预处理数据分析与可视化机器学习建模贝叶斯逻辑回归支持向量机随机森林XGBoost总结每文一语 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私…

redis集群三种模式

redis 集群 高可用 redis集群三种模式 主从复制 奇数台 3 一主两从 哨兵模式 3 一主两从 cluser 集群 6 3 3 3 9 主从复制&#xff1a;和mysql的主从复制类似&#xff0c;写入主的数据通过rdb方式把数据同步到从服务器。从不能更新到主&#xff0c;…

未来不会使用 AI 的人真的会被淘汰吗?

AI 是今年大火的一个话题&#xff0c;随着 ChatGPT 之类的一系列大模型开始流行以后&#xff0c;有不少的培训机构宣称这样的口号: “未来不会使用 AI 的人将会被淘汰”。我觉得这个观点本身并没有错&#xff0c;但是关键在于那些培训机构出于自身的利益&#xff0c;故意忽略了…

内存问题检测

内存检测方式 gcc/g 内存检测方式如下&#xff0c;添加一些编译标签&#xff1a; -fsanitizeleak 检测内存泄漏。例如添加标签&#xff1a;-fsanitizeleak -g -O0-fsanitizeaddress 检测内存越界。例如添加标签&#xff1a;-fsanitizeaddress -g -O2&#xff0c;优化级别开…

02 I/O多路复用---进程的聊天

服务器同时和很多客户端连在一起 管道的read&#xff0c;总是能读出来

前后端分离开发遵循接口规范-YAPI

目前&#xff0c;网站主流开发方式是前后端分离。因此前后端必须遵循一套统一的规范&#xff0c;才能保证前后端进行正常的数据&#xff08;JSON数据格式&#xff09;请求、影响&#xff0c;这套规范即是 YAPI. 产品经理撰写原型&#xff1b; 前端或后端撰写接口文档。 YAPI…

Android高级interview

一、Android基础知识 1、四大组件、六大布局、五大存储 四大组件&#xff1a; activity、service、content provider、broadcast六大布局&#xff08;现在是 7 大了&#xff09;: 线性布局&#xff08;LinearLayout&#xff09;相对布局&#xff08;RelativeLayout&#xf…

替换后端国外身份目录服务,宁盾身份域管接管FileNet助力国产化升级

IBM FileNet 是一款优秀的企业内容管理解决方案&#xff0c;为客户提供了领先的文档管理和流程管理集成环境&#xff0c;被大量企业所采用。FileNet 需要使用企业级的目录服务器&#xff08;LDAP&#xff09;作为其用户管理系统&#xff0c;满足其认证和授权的需求。对于 LDAP …

成为git砖家(4): git status 命令简介

1. untracked 和 tracked 状态 Remember that each file in your working directory can be in one of two states: tracked or untracked. Tracked files are files that were in the last snapshot, as well as any newly staged files; they can be unmodified, modified, o…

zabbix使用脚本自定义监控项

1. 在zabbix_agent的配置文件中配置自定义key和脚本位置 vim /etc/zabbix/zabbix_agentd.confUserParametermq_check_log,/etc/zabbix/zabbix_agentd.d/mqlog.shmq_check_log&#xff1a;是这个自定义参数的名称。在Zabbix的监控项&#xff08;item&#xff09;配置中&#xf…

点菜吧——随便点 C#生成套餐

前言 一到食堂发现有多种选择&#xff0c;但是有一个固定的套路&#xff0c;只能是一个荤&#xff0c;二个小荤&#xff0c;菜品数量也不少&#xff0c;任君选择&#xff0c;如果是一个选择困难症&#xff0c;就有点烦了&#xff0c;所以出品这个自动生成套餐软件。各位老板可…

代码随想录算法训练营Day 63| 图论 part03 | 417.太平洋大西洋水流问题、827.最大人工岛、127. 单词接龙

代码随想录算法训练营Day 63| 图论 part03 | 417.太平洋大西洋水流问题、827.最大人工岛、127. 单词接龙 文章目录 代码随想录算法训练营Day 63| 图论 part03 | 417.太平洋大西洋水流问题、827.最大人工岛、127. 单词接龙17.太平洋大西洋水流问题一、DFS二、BFS三、本题总结 82…

在手机查看笔记本电脑上的便签 笔记本电脑和手机共享便签方法

在这个信息时代&#xff0c;笔记本电脑已成为我们工作和学习中不可或缺的工具。我经常在笔记本上记录各种便签&#xff0c;无论是工作中的待办事项&#xff0c;还是生活中的小提醒&#xff0c;都依赖于这些小小的便签。它们轻便、灵活&#xff0c;可以随时随地提醒我接下来要做…

TongHttpServer 简介

1. 概述 随着网络技术的飞速发展,高并发大用户场景越来越普遍,单一应用服务节点已经不能满足并发需求,为了提高整个系统可靠性,扩展性,吞吐率,通常将多个应用服务器通过硬负载/软负载组成集群,负载均衡器根据不同负载算法将请求分发到各个应用服务器节点。 Tong…

花几千上万学习Java,真没必要!(三十六)

1、File类&#xff1a; 测试代码1&#xff1a; package filetest.com; import java.io.File; import java.io.IOException; public class FileOperations { public static void main(String[] args) { // 创建新文件File file new File("example.txt"); tr…

Prometheus+Grafana+Alertmanager监控告警

PrometheusGrafanaAlertmanager告警 Alertmanager开源地址&#xff1a;github.com/prometheus Prometheus是一款基于时序数据库的开源监控告警系统&#xff0c;它是SoundCloud公司开源的&#xff0c;SoundCloud的服务架构是微服务架构&#xff0c;他们开发了很多微服务&#xf…

TCP为什么需要四次挥手?

tcp为什么需要四次挥手&#xff1f; 答案有两个&#xff1a; 1.将发送fin包的权限交给被动断开方的应用层去处理&#xff0c;也就是让程序员处理 2.接第一个答案&#xff0c;应用层有了发送fin的权限&#xff0c;可以在发送fin前继续向对端发送消息 为了搞清楚这个问题&…

前端开发知识-vue

大括号里边放键值对&#xff0c;即是一个对象。 一、vue可以简化前端javascript的操作。 主要特点是可以实现视图、数据的双向绑定。 使用vue主要分为三个步骤&#xff1a; 1.javascript中引入vue.js 可以src中可以是vue的网址&#xff0c;也可以是本地下载。 2.在javasc…

网络爬虫必备工具:代理IP科普指南

文章目录 1. 网络爬虫简介1.1 什么是网络爬虫&#xff1f;1.2 网络爬虫的应用领域1.3 网络爬虫面临的主要挑战 2. 代理IP&#xff1a;爬虫的得力助手2.1 代理IP的定义和工作原理2.2 爬虫使用代理IP的必要性 3. 代理IP的类型及其在爬虫中的应用3.1 动态住宅代理3.2 动态数据中心…