数据结构——看完这篇保证你学会队列
数据结构——队列
- 一、队列的概念
- 二、队列的实现方式
- 三、队列所需要的接口
- 四、接口的详细实现
- 4.1初始化
- 4.2销毁
- 4.3入队
- 4.5出队
- 4.6获取队头元素
- 4.7获取队尾元素
- 4.8获取队列元素个数
- 4.9判空
- 五、完整代码
- 5.1Queue.h
- 5.2Queue.c
- 5.3test.c
一、队列的概念
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,
队列具有先进先出FIFO(First In First Out)
入队列:进行插入操作的一端称为队尾 。
出队列:进行删除操作的一端称为队头。

二、队列的实现方式
队列可以用数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。
三、队列所需要的接口
//初始化
void QueueInit(Queue* pq);//销毁
void QueueDestory(Queue* pq);//入队
void QueuePush(Queue* pq, Queuedatatype x);//出队
void QueuePop(Queue* pq);//获取队头元素
Queuedatatype QueueFront(Queue* pq);//获取队尾元素
Queuedatatype QueueBack(Queue* pq);//获取队列元素个数
int Queuesize(Queue* pq);//判空
bool QueueEmpty(Queue* pq);
四、接口的详细实现
4.1初始化
初始化:我们需要将pq->phead和pq->ptail都置为NULL,并且将pq->size置为0;
oid QueueInit(Queue* pq)
{assert(pq);pq->phead = NULL;pq->ptail = NULL;pq->size = 0;
}
4.2销毁
销毁:首先定义一个cur指针保存头节点phead的地址,接下来利用cur!=NULL使得循环往下走,在循环内定义一个next的指针来更新地址,并且用free来释放内存,出循环后,将pq->phead,pq->ptail都置为NULL,并且将pq->size置为0。
void QueueDestory(Queue* pq)
{assert(pq);Queuenode* cur = pq->phead;while (cur){Queue* next = cur->next;free(cur);cur = next;}pq->phead = pq->ptail = NULL;pq->size = 0;
}

4.3入队
入队:入队有两种情况。第一种,队内无其他元素;第二种,队内有其他元素。
①、队内无其他元素:直接让pq->phead = pq->ptail = newnode;

②、队内有其它元素:如果队列不为NULL,我们需要让pq->ptail->next指向newnode,并且最后再让pq->ptail指向newnode.

oid QueuePush(Queue* pq, Queuedatatype x)
{assert(pq);Queuenode* newnode = (Queuenode*)malloc(sizeof(Queuenode));if (newnode == NULL){perror("malloc fail");return;}newnode->data = x;newnode->next = NULL;//队内无其它元素if (pq->phead == NULL){assert(pq->ptail == NULL);pq->phead = pq->ptail = newnode;}else{//链接pq->ptail->next = newnode;pq->ptail = newnode;}pq->size++;
}
4.5出队
出队:出队列大体上分为两种情况:有节点和无节点。
①、如果队列中没有节点,就不能进行出队操作,我们这时可以用assert(!QueueEmpty(pq)); 来进行判断。
②、队列中有节点时,又可以分为一个节点和多个节点之分,如果队列中只有一个节点时,我们直接用free 置空;如果队列中有多个节点时,首先、创建一个next用来保存phead的下一个节点的地址,我们free(phead),再让phead等于我们的next。
// 出队
void QueuePop(Queue * pq)
{assert(pq);assert(!QueueEmpty(pq));//一个节点if (pq->phead->next == NULL){free(pq->phead);pq->phead = pq->ptail=NULL;}//多个节点else{//头删Queuenode* next = pq->phead->next;free(pq->phead);pq->phead = next;}pq->size--;
}
4.6获取队头元素
//获取队头元素
Queuedatatype QueueFront(Queue* pq)
{assert(pq);return pq->phead->data;
}
4.7获取队尾元素
//获取队尾元素
Queuedatatype QueueBack(Queue* pq)
{assert(pq);return pq->ptail->data;
}
4.8获取队列元素个数
//获取队列元素个数
int Queuesize(Queue* pq)
{assert(pq);return pq->size;
}
4.9判空
如果pq->size==0时,便证明队列为NULL。
//判空
bool QueueEmpty(Queue* pq)
{assert(pq);return pq->size == 0;
}
五、完整代码
5.1Queue.h
#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>typedef int Queuedatatype;
//定义队列结构
typedef struct Queuenode
{struct Queuenode* next;Queuedatatype data;
}Queuenode;typedef struct Queue
{Queuenode* phead;Queuenode* ptail;int size;
}Queue;//初始化
void QueueInit(Queue* pq);//销毁
void QueueDestory(Queue* pq);//入队
void QueuePush(Queue* pq, Queuedatatype x);//出队
void QueuePop(Queue* pq);//获取队头元素
Queuedatatype QueueFront(Queue* pq);//获取队尾元素
Queuedatatype QueueBack(Queue* pq);//获取队列元素个数
int Queuesize(Queue* pq);//判空
bool QueueEmpty(Queue* pq);
5.2Queue.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"Queue.h"
//初始化
void QueueInit(Queue* pq)
{assert(pq);pq->phead = NULL;pq->ptail = NULL;pq->size = 0;
}//销毁
void QueueDestory(Queue* pq)
{assert(pq);Queuenode* cur = pq->phead;while (cur){Queue* next = cur->next;free(cur);cur = next;}pq->phead = pq->ptail = NULL;pq->size = 0;
}//入队
void QueuePush(Queue* pq, Queuedatatype x)
{assert(pq);Queuenode* newnode = (Queuenode*)malloc(sizeof(Queuenode));if (newnode == NULL){perror("malloc fail");return;}newnode->data = x;newnode->next = NULL;if (pq->phead == NULL){assert(pq->ptail == NULL);pq->phead = pq->ptail = newnode;}//链接pq->ptail->next = newnode;pq->ptail = newnode;pq->size++;
}// 出队
void QueuePop(Queue * pq)
{assert(pq);assert(!QueueEmpty(pq));//一个节点if (pq->phead->next == NULL){free(pq->phead);pq->phead = pq->ptail=NULL;}//多个节点else{//头删Queuenode* next = pq->phead->next;free(pq->phead);pq->phead = next;}pq->size--;
}//获取队头元素
Queuedatatype QueueFront(Queue* pq)
{assert(pq);return pq->phead->data;
}//获取队尾元素
Queuedatatype QueueBack(Queue* pq)
{assert(pq);return pq->ptail->data;
}//获取队列元素个数
int Queuesize(Queue* pq)
{assert(pq);return pq->size;
}//判空
bool QueueEmpty(Queue* pq)
{assert(pq);return pq->size == 0;
}
5.3test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"Queue.h"
void test1()
{Queue q;QueueInit(&q);QueuePush(&q, 1);QueuePush(&q, 2);QueuePush(&q, 3);QueuePush(&q, 4);printf("Size:%d\n", Queuesize(&q));while (!QueueEmpty(&q)){printf("%d ", QueueFront(&q));QueuePop(&q);}}
int main()
{test1();return 0;
}
相关文章:
数据结构——看完这篇保证你学会队列
数据结构——队列 一、队列的概念二、队列的实现方式三、队列所需要的接口四、接口的详细实现4.1初始化4.2销毁4.3入队4.5出队4.6获取队头元素4.7获取队尾元素4.8获取队列元素个数4.9判空 五、完整代码5.1Queue.h5.2Queue.c5.3test.c 一、队列的概念 队列:只允许在…...
开源免费缺陷管理工具:对比6款
在软件开发环境中,缺陷管理工具是关键的基础设施。例如,在构建一个电商平台时,这些工具能系统地跟踪从发现到解决的各个问题阶段。它们支持多用户协作,实现信息和状态的实时共享。通过数据分析,这些工具还能帮助团队识…...
Weblogic反序列化漏洞
文章目录 1、搭建环境2、漏洞特征3、漏洞利用1)获取用户名密码2)后台上传shell 4、检测工具 1、搭建环境 漏洞环境基于vulhub搭建–进入weak_password的docker环境 sudo docker-compose up -d拉取靶场 2、漏洞特征 404特征Weblogic常用端口:7001 3、漏洞利用…...
element-ui el-table 滚动到底部,进行加载下一页
使用element-ui 自带的InfiniteScroll 无限滚动组件无法使用在table里面,所以项目只能组件写一个 俺的方法是写了一个自定义组件,进行监听滚动条是否拉到最底部进行一个处理。方法如下 直接复制完事了, loadTableMore: { bind(el, binding…...
线性代数的学习和整理19,特征值,特征向量,以及引入的正交化矩阵概念(草稿)
目录 1 什么是特征值和特征向量? 1.1 特征值和特征向量这2个概念先放后 1.2 直观定义 1.3 严格定义 2 如何求特征值和特征向量 2.1 方法1:结合图形看,直观方法求 2.1.1 单位矩阵的特征值和特征向量 2.1.2 旋转矩阵 2.2 根据严格定义…...
初步了解android如何锁键
百年三万六千日,光阴只有瞬息间。 手机下面的三个图形,正方形,园形,三角形分别的什么建?都起到什么功能? 三角形的那个叫返回键,就是可以返回你的上一个操作; 圆形是HOME键,按一下可…...
行业追踪,2023-09-13
自动复盘 2023-09-13 凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让…...
$nextTick和setTimeout区别(宏任务微任务)
nextTick 在vue 源码中是利用 Promise.resolve()实现的。该问题实际就是Promise与setTimeout的区别,本质是Event Loop中微任务与宏任务的区别。 nextTick:在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。…...
Linux内核及可加载内核模块编程
图1 Linux系统整体结构 图2 Linux的源代码结构 下面显示一段内核模块代码案例: #include <linux/moduLe.h> #include <linux/kernel.h #include <linux/intt.h> /*模块的初始化函数lkp_ init()_init是用于初始化的修饰符 */ static int __init lk…...
软件设计师_备考笔记
考试介绍及考点分布情况 考试要求: (1)掌握数据表示、算术和逻辑运算; (2)掌握相关的应用数学、离散数学的基础知识; (3)掌握计算机体系结构以及各主要部件的性能和基…...
Java学习笔记------抽象类和抽象方法
抽象方法 抽象方法:将共性的行为(方法)抽取到父类之后,由于每一个子类执行的内容是不一样的,所以,在父类中不能确定具体的方法体,该方法就可以定义为抽象方法抽象类:如果一个类中存…...
毕业设计选题指南-25个优质选题
毕业设计是大学生活中的一项重要任务,它不仅代表了您所学知识的应用,还为未来职业道路奠定了基础。然而,许多学生常常陷入选题的困境,不知道如何选择一个合适的毕业设计题目。本文将提供一些建议,帮助您决定一个适合您…...
React使用useImperativeHandle实现父组件触发子组件事件
相关知识: useImperativeHandle forwardRef 相关代码: 获取子组件实例,由于这是函数组件,没有this因此不能整体获取,我们可以通过useImperativeHandle获取想要的变量或者方法。 父组件import React, { useRef } fro…...
【PowerQuery】Excel的PowerQuery的复制
在Excel中构建符合要求的PowerQuery连接之后,所有的PowerQuery 连接已经顺利的保存在Excel 工作簿当中,但是如何去查看已经保存的PowerQuery连接呢?图6.3 显示了查看PowerQuery连接。 Excel界面->数据页签->查询与连接 如果你的Power…...
这个制作企业期刊的神器我怎么没早点发现
和大家分享个好消息,发现这款制作企业期刊的神器特好用 有点后悔早些没发现它,没用过的可以试试,FLBOOK在线制作电子杂志平台 下面教大家一些如何使用FLBOOK的过程 1.打开FLBOOK平台,点击登录与注册 2.点击开始制作,…...
核心实验18_ospf高级_ENSP
项目场景: 核心实验18_ospf高级_ENSP 多区域虚链路 实搭拓扑图: 具体操作: R1: [R1]ospf 1 router-id 1.1.1.1 [R1-ospf-1]area 0 [R1-ospf-1-area-0.0.0.0]net 1.1.1.0 0.0.0.255 [R1-ospf-1-area-0.0.0.0]net 10.1.12.0 0.0.0.255 [R1-os…...
【python零基础入门学习】python基础篇之系统模块调用shell命令执行(四)
本站以分享各种运维经验和运维所需要的技能为主 《python》:python零基础入门学习 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8》暂未更新 《docker学习》暂未更新 《ceph学习》ceph日常问题解…...
用python实现基本数据结构【01/4】
说明 如果需要用到这些知识却没有掌握,则会让人感到沮丧,也可能导致面试被拒。无论是花几天时间“突击”,还是利用零碎的时间持续学习,在数据结构上下点功夫都是值得的。那么Python 中有哪些数据结构呢?列表、字典、集…...
Ubuntu22.04 install Kafka
kafka quickstart install kafka...
实现JSONP请求
同源策略 JavaScript 的浏览器都会使用这个策略。所谓同源是指,域名,协议,端口相同。 而所有非同源的请求(即 域名,协议,端口 其中一种或多种不相同),都会被作为跨域请求。实际上请求…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
