数据结构之队的实现
𝙉𝙞𝙘𝙚!!👏🏻‧✧̣̥̇‧✦👏🏻‧✧̣̥̇‧✦ 👏🏻‧✧̣̥̇:Solitary-walk
⸝⋆ ━━━┓
- 个性标签 - :来于“云”的“羽球人”。 Talk is cheap. Show me the code
┗━━━━━━━ ➴ ⷯ本人座右铭 : 欲达高峰,必忍其痛;欲戴王冠,必承其重。
👑💎💎👑💎💎👑
💎💎💎自💎💎💎
💎💎💎信💎💎💎
👑💎💎 💎💎👑 希望在看完我的此篇博客后可以对你有帮助哟👑👑💎💎💎👑👑 此外,希望各位大佬们在看完后,可以互赞互关一下,看到必回
👑👑👑💎👑👑👑
一·队的初始化
二·队的销毁
三·出队(头删)
四·进队(尾插)
五·队的判空
六·取队头元素
七·取队尾元素
八·求队的大小
在进行以下接口的实现中,我们需要首先对队有一定的了解:
1)队的特征:队头出元素,队尾进元素
2)对于队我们又有顺序队和链队之分
3)链队:它是由一个一个的结点进行连接起来的;其次每一个结点又有对应的数据域与指针域
所以说,我们的队其实是一个双层嵌套的结构体:一个是对队的自定义结构体(队头指 针,队尾指针,size(注意他可以没有,但是为了避免多次的遍历,我们这里就设置了 size:记录队的大小));另一个就是自定义的结点类型的结构体
1.初始化
这里只需把指向队的头指针,尾指针置空即可
void QuequeInit(Queque* p)//对队进行初始化,所以这里传的是指向队的指针,(QNode* p)这样写是不对的
{assert(p);p->phead = NULL;p->ptail = NULL;p->size = 0;
}
2.销毁
其实同链表的销毁是一样的,我们只需把结点进行一个一个的free就行了
还有就是销毁完之后别忘了让头尾指针置空

3.出队
出队首先是队头进行的
这里我们就需要对元素个数进行判断:是只有一个元素还是多个元素
元素出队之后别忘了size--

当队里面只有一个元素的时候,把1 删除之后,这就是一个空队了,所以在出队之后就需要对头尾指针进行置空

当我有多个数据时,就正常进行头删就行别忘了对应的头节点需要进行更新
void QuequePop(Queque* p)//出队,在队头进行
{//2种情况 只有1个结点 有多个结点assert(p);assert(!QuequeEmpty(p));//确保队不为空if (p->phead->next == NULL){free(p->phead);p->phead =p->ptail = NULL;return;}else{QNode* next = p->phead->next;free(p->phead);p->phead = next;}//别忘size--p->size--;//注意--和-1区别
}
4.进队
1)进队换言之就是尾插,首先我们需要对尾插进来的数据进行结点的创建
2)判空 的操作:为空此时尾插进来 的数据就是我的新的头尾结点;不为空,尾插进来的数据就是新的尾结点,进行尾结点的更新
void QuequePush(Queque* p,DataType x)//进队,在队尾进行
{// 1 创建一个结点 2 对队进行判空操作assert(p);QNode* newnode = (QNode*)malloc(sizeof(QNode));//这里是对结点开辟空间,sizeof(Queque)这样写是错误的if (newnode == NULL){perror("malloc fail\n");return;}//开辟成功newnode->data = x;newnode->next = NULL;//对队的判空操作if (p->phead == NULL){assert(p->ptail == NULL);//确保尾指针也为空p->ptail = p->phead = newnode;}else{p->ptail->next = newnode;p->ptail = newnode;//尾结点更新}//别忘了size++p->size++;
}
5.判空
bool QuequeEmpty(Queque* p)//判空
{assert(p);return p->phead == NULL&& p->ptail == NULL;//return p->size == 0;//注意这里一定要保持size一致性,即不要忘了++ / --
}
6.取队头元素
DataType QuequeFront(Queque* p)//取队头元素
{assert(p);assert(!QuequeEmpty(p));return p->phead->data;//取完队头元素不要忘了--
}
7.取队尾元素
DataType QuequeBack(Queque* p)//取队尾元素
{assert(p);assert(!QuequeEmpty(p));return p->ptail->data;}
8.队的大小
int QuequeSize(Queque* p)//队的大小
{assert(p);return p->size;
}
Quqque.h对应完整代码:
#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdbool.h>
#include<stdlib.h>typedef int DataType;
//定义一个结构体:单链表可以解决没必要用双向链表,(单链表)链队列:数据域,指针域
//注意以下2个结构体不能进行合并
typedef struct QuequeNode
{//注意以下只是定义队列的一个结点对应的类型DataType data;//数据域struct SLQuequeNode* next;//指针域
}QNode;
typedef struct Queque
{//注意以下只是定义队列的类型QNode* phead;//队列的头指针QNode* ptail;//队列的尾指针int size;//记录数据个数,避免后续的遍历
}Queque;
//队列接口的实现
void QuequeInit(Queque* p);//初始化
void QuequeDestroy(Queque* p);//销毁
void QuequePop(Queque* p);//出队,在队头进行
void QuequePush(Queque* p,DataType x);//进队,在队尾进行
bool QuequeEmpty(Queque* p);//判空
DataType QuequeFront(Queque* p);//
DataType QuequeBack(Queque* p);//
int QuequeSize(Queque* p);//队的大小
Quqque.c对应完整代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include"Queque.h"void QuequeInit(Queque* p)//对队进行初始化,所以这里传的是指向队的指针,(QNode* p)这样写是不对的
{assert(p);p->phead = NULL;p->ptail = NULL;p->size = 0;
}
void QuequeDestroy(Queque* p)//销毁
{assert(p);/*Queque* pcur = p->phead;*///因为是对结点一个一个删除QNode* pcur = p->phead;while (pcur){/*Queque* next = pcur->next;*///错误写法,原因同上QNode* next = pcur->next;free(pcur);pcur = next;}//别忘了执行以下操作p->phead = NULL;p->ptail = NULL;p->size = 0;
}
void QuequePop(Queque* p)//出队,在队头进行
{//2种情况 只有1个结点 有多个结点assert(p);assert(!QuequeEmpty(p));//确保队不为空if (p->phead->next == NULL){free(p->phead);p->phead =p->ptail = NULL;return;}else{QNode* next = p->phead->next;free(p->phead);p->phead = next;}//别忘size--p->size--;//注意--和-1区别
}
void QuequePush(Queque* p,DataType x)//进队,在队尾进行
{// 1 创建一个结点 2 对队进行判空操作assert(p);QNode* newnode = (QNode*)malloc(sizeof(QNode));//这里是对结点开辟空间,sizeof(Queque)这样写是错误的if (newnode == NULL){perror("malloc fail\n");return;}//开辟成功newnode->data = x;newnode->next = NULL;//对队的判空操作if (p->phead == NULL){assert(p->ptail == NULL);//确保尾指针也为空p->ptail = p->phead = newnode;}else{p->ptail->next = newnode;p->ptail = newnode;//尾结点更新}//别忘了size++p->size++;
}
bool QuequeEmpty(Queque* p)//判空
{assert(p);return p->phead == NULL&& p->ptail == NULL;//return p->size == 0;//注意这里一定要保持size一致性,即不要忘了++ / --
}
DataType QuequeFront(Queque* p)//取队头元素
{assert(p);assert(!QuequeEmpty(p));return p->phead->data;//取完队头元素不要忘了--
}
DataType QuequeBack(Queque* p)//取队尾元素
{assert(p);assert(!QuequeEmpty(p));return p->ptail->data;}
int QuequeSize(Queque* p)//队的大小
{assert(p);return p->size;
}
test.c对应完整代码:
#define _CRT_SECURE_NO_WARNINGS 1#include"Queque.h"
void Quequetest()
{Queque plist;QuequeInit(&plist);QuequePush(&plist, 1);QuequePush(&plist, 2);QuequePush(&plist, 3);QuequePush(&plist, 4);//QuequePop(&plist);//QuequePop(&plist);//QuequePop(&plist);//QuequePop(&plist);while (!QuequeEmpty(&plist))//打印队的数据,只要不为空即可{printf("%d ", QuequeFront(&plist));//其实就是取出队头元素QuequePop(&plist);//出队}printf("\n");QuequeDestroy(&plist);}
int main()
{Quequetest();return 0;
}
相关文章:
数据结构之队的实现
𝙉𝙞𝙘𝙚!!👏🏻‧✧̣̥̇‧✦👏🏻‧✧̣̥̇‧✦ 👏🏻‧✧̣̥̇:Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - :来于“云”的“羽球人”。…...
【实战Flask API项目指南】之三 路由和视图函数
实战Flask API项目指南之 路由和视图函数 本系列文章将带你深入探索实战Flask API项目指南,通过跟随小菜的学习之旅,你将逐步掌握 Flask 在实际项目中的应用。让我们一起踏上这个精彩的学习之旅吧! 前言 当小菜踏入Flask后端开发的世界时&…...
mediasoup udp端口分配策略
mediasoup-worker多进程启动时,rtcMinPort/rtcMaxPort可以使用相同的配置。 for (let i 0; i < numWorkers; i) { let worker await mediasoup.createWorker({ logLevel: config.mediasoup.worker.logLevel, logTags: config.mediasoup.work…...
山西电力市场日前价格预测【2023-11-07】
日前价格预测 预测说明: 如上图所示,预测明日(2023-11-07)山西电力市场全天平均日前电价为318.54元/MWh。其中,最高日前电价为514.01元/MWh,预计出现在18: 00。最低日前电价为192.95元/MWh,预计…...
Microsoft Dynamics 365 CE 扩展定制 - 5. 外部集成
本章内容包括: 使用.NET从其他系统连接到Dynamics 365使用OData(Java)从其他系统连接到Dynamics 365使用外部库从外部源检索数据使用web应用程序连接到Dynamics 365运行Azure计划任务设置Azure Service Bus终结点与Azure Service Bus构建近乎实时的集成使用来自Azure服务总线…...
手机升级STM32单片机,pad下载程序,手机固件升级单片机,局域网程序下载,STM32单片机远程下载升级
STM32单片机,是我们最常见的一种MCU。通常我们在使用STM32单片机都会遇到程序在线升级下载的问题。 STM32单片机的在线下载通常需要以下几种方式完成: 1、使用ST提供的串口下载工具,本地完成固件的升级下载。 2、自行完成系统BootLoader的编写…...
【漏洞复现】weblogic-SSRF漏洞
感谢互联网提供分享知识与智慧,在法治的社会里,请遵守有关法律法规 文章目录 漏洞测试注入HTTP头,利用Redis反弹shell 问题解决 Path : vulhub/weblogic/ssrf 编译及启动测试环境 docker compose up -dWeblogic中存在一个SSRF漏洞࿰…...
FreeSWTCH dialplan check nosdp
应朋友要求写一段dialplan,如果没有sdp(sip_profile打开了3pcc),马上回486,当然如果有sdp,dialplan正常往下走 我试了试,貌似不太复杂,如下: <!-- check no sdp --&…...
微信小程序案例3-1 比较数字
文章目录 一、运行效果二、知识储备(一)Page()函数(二)数据绑定(三)事件绑定(四)事件对象(五)this关键字(六)setData()方法࿰…...
哈希表----数据结构
引入 如果你是一个队伍的队长,现在有 24 个队员,需要将他们分成 6 组,你会怎么分?其实有一种方法是让所有人排成一排,然后从队头开始报数,报的数字就是编号。当所有人都报完数后,这 24 人也被分…...
可达矩阵-邻接矩阵-以及有向图的python绘制
参考1 自定义输入矩阵来绘制 根据参考代码, 自定义 代码如下: # 编程实现有向图连通性的判断 from pylab import mplmpl.rcParams[font.sans-serif] [SimHei] mpl.rcParams[axes.unicode_minus] False import numpy as np import networkx as nx imp…...
react typescript @别名的使用
1、config/webpack.config.js中找到alias,添加: path.resolve(src) ,如下: alias: {// Support React Native Web// https://www.smashingmagazine.com/2016/08/a-glimpse-into-the-future-with-react-native-for-web/"react-native&qu…...
C++性能优化笔记-6-C++元素的效率差异-7-类型转换
C元素的效率差异 类型转换signed与unsigned转换整数大小转换浮点精度转换整数到浮点转换浮点到整数转换指针类型转换重新解释对象的类型const_caststatic_castreinterpret_castdynamic_cast转换类对象 类型转换 在C语法中,有几种方式进行类型转换: // …...
c#中switch常用模式
声明模式 首先检查value的类型,然后根据类型输出相应的消息 public void ShowMessage(object value) {switch (value){case int i: Console.WriteLine($"value is int:{i}"); break;case long l: Console.WriteLine($"value is long:{l}"); b…...
Flink SQL 常用作业sql
目录 flink sql常用配置kafka source to mysql sink窗口函数 开窗datagen 自动生成数据表tumble 滚动窗口hop 滑动窗口cumulate 累积窗口 grouping sets 多维分析over 函数TopN flink sql常用配置 设置输出结果格式 SET sql-client.execution.result-modetableau;kafka source…...
nodejs国内镜像及切换版本工具nvm
淘宝 NPM 镜像站(http://npm.taobao.org)已更换域名,新域名: Web 站点:https://npmmirror.com Registry Endpoint:https://registry.npmmirror.com 详见: 【望周知】淘宝 NPM 镜像换域名了&…...
用Rust和Scraper库编写图像爬虫的建议
本文提供一些有关如何使用Rust和Scraper库编写图像爬虫的一般建议: 1、首先,你需要安装Rust和Scraper库。你可以通过Rustup或Cargo来安装Rust,然后使用Cargo来安装Scraper库。 2、然后,你可以使用Scraper库的Crawler类来创建一个…...
Java 语言环境搭建
JDK 是一种用于构建在 Java 平台上发布的应用程序、Applet 和组件的开发环境,即编写 Java 程序必须使用 JDK,它提供了编译和运行 Java 程序的环境。 在安装 JDK 之前,首先要到 Oracle 网站获取 JDK 安装包。JDK 安装包被集成在 Java SE 中&a…...
酷开科技 | 酷开系统里萌萌哒小维在等你!
在一片金黄淡绿的颜色中,深秋的脚步更近了,在这个气候微凉的季节里,你是不是更想拥有一种温暖的陪伴呢?酷开科技智慧AI语音功能更懂你,贴心的小维用心陪伴你的每一天。 01.全天候陪伴 在酷开系统中,只要你…...
Bash 4关联数组:错误“声明:-A:无效选项”
Bash 4 associative arrays: error “declare: -A: invalid option” 就是bash版本太低 1.先确定现在的版本 bash -version 我的就是版本太低 升级新版本bash4.2 即可 升级步骤 1.下载bash-4.2wget http://ftp.gnu.org/gnu/bash/bash-4.2.tar.gz 2. 下载完成解压 tar -zxvf…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
