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

数据结构之队的实现

𝙉𝙞𝙘𝙚!!👏🏻‧✧̣̥̇‧✦👏🏻‧✧̣̥̇‧✦ 👏🏻‧✧̣̥̇: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;
}

相关文章:

数据结构之队的实现

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…...

【实战Flask API项目指南】之三 路由和视图函数

实战Flask API项目指南之 路由和视图函数 本系列文章将带你深入探索实战Flask API项目指南&#xff0c;通过跟随小菜的学习之旅&#xff0c;你将逐步掌握 Flask 在实际项目中的应用。让我们一起踏上这个精彩的学习之旅吧&#xff01; 前言 当小菜踏入Flask后端开发的世界时&…...

mediasoup udp端口分配策略

mediasoup-worker多进程启动时&#xff0c;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】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-11-07&#xff09;山西电力市场全天平均日前电价为318.54元/MWh。其中&#xff0c;最高日前电价为514.01元/MWh&#xff0c;预计出现在18: 00。最低日前电价为192.95元/MWh&#xff0c;预计…...

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单片机&#xff0c;是我们最常见的一种MCU。通常我们在使用STM32单片机都会遇到程序在线升级下载的问题。 STM32单片机的在线下载通常需要以下几种方式完成&#xff1a; 1、使用ST提供的串口下载工具&#xff0c;本地完成固件的升级下载。 2、自行完成系统BootLoader的编写…...

【漏洞复现】weblogic-SSRF漏洞

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 文章目录 漏洞测试注入HTTP头&#xff0c;利用Redis反弹shell 问题解决 Path : vulhub/weblogic/ssrf 编译及启动测试环境 docker compose up -dWeblogic中存在一个SSRF漏洞&#xff0…...

FreeSWTCH dialplan check nosdp

应朋友要求写一段dialplan&#xff0c;如果没有sdp&#xff08;sip_profile打开了3pcc&#xff09;&#xff0c;马上回486&#xff0c;当然如果有sdp&#xff0c;dialplan正常往下走 我试了试&#xff0c;貌似不太复杂&#xff0c;如下&#xff1a; <!-- check no sdp --&…...

微信小程序案例3-1 比较数字

文章目录 一、运行效果二、知识储备&#xff08;一&#xff09;Page()函数&#xff08;二&#xff09;数据绑定&#xff08;三&#xff09;事件绑定&#xff08;四&#xff09;事件对象&#xff08;五&#xff09;this关键字&#xff08;六&#xff09;setData()方法&#xff0…...

哈希表----数据结构

引入 如果你是一个队伍的队长&#xff0c;现在有 24 个队员&#xff0c;需要将他们分成 6 组&#xff0c;你会怎么分&#xff1f;其实有一种方法是让所有人排成一排&#xff0c;然后从队头开始报数&#xff0c;报的数字就是编号。当所有人都报完数后&#xff0c;这 24 人也被分…...

可达矩阵-邻接矩阵-以及有向图的python绘制

参考1 自定义输入矩阵来绘制 根据参考代码&#xff0c; 自定义 代码如下&#xff1a; # 编程实现有向图连通性的判断 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&#xff0c;添加: path.resolve(src) &#xff0c;如下&#xff1a; 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语法中&#xff0c;有几种方式进行类型转换&#xff1a; // …...

c#中switch常用模式

声明模式 首先检查value的类型&#xff0c;然后根据类型输出相应的消息 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 镜像站&#xff08;http://npm.taobao.org&#xff09;已更换域名&#xff0c;新域名&#xff1a; Web 站点&#xff1a;https://npmmirror.com Registry Endpoint&#xff1a;https://registry.npmmirror.com 详见&#xff1a; 【望周知】淘宝 NPM 镜像换域名了&…...

用Rust和Scraper库编写图像爬虫的建议

本文提供一些有关如何使用Rust和Scraper库编写图像爬虫的一般建议&#xff1a; 1、首先&#xff0c;你需要安装Rust和Scraper库。你可以通过Rustup或Cargo来安装Rust&#xff0c;然后使用Cargo来安装Scraper库。 2、然后&#xff0c;你可以使用Scraper库的Crawler类来创建一个…...

Java 语言环境搭建

JDK 是一种用于构建在 Java 平台上发布的应用程序、Applet 和组件的开发环境&#xff0c;即编写 Java 程序必须使用 JDK&#xff0c;它提供了编译和运行 Java 程序的环境。 在安装 JDK 之前&#xff0c;首先要到 Oracle 网站获取 JDK 安装包。JDK 安装包被集成在 Java SE 中&a…...

酷开科技 | 酷开系统里萌萌哒小维在等你!

在一片金黄淡绿的颜色中&#xff0c;深秋的脚步更近了&#xff0c;在这个气候微凉的季节里&#xff0c;你是不是更想拥有一种温暖的陪伴呢&#xff1f;酷开科技智慧AI语音功能更懂你&#xff0c;贴心的小维用心陪伴你的每一天。 01.全天候陪伴 在酷开系统中&#xff0c;只要你…...

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…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

Go语言多线程问题

打印零与奇偶数&#xff08;leetcode 1116&#xff09; 方法1&#xff1a;使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...