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

栈和队列详解(2)

目录

一、什么是队列?

二、创建一个我们自己的队列

1.前置准备

1.1需要的三个文件

  1.2结构体的创建和头文件的引用

2.接口的实现

2.1初始化队列

2.2入队

2.3队列元素个数和判空

 2.4取队头元素和队尾元素

 2.5出队

 2.6摧毁队列

2.7测试接口

 三、所有代码

1.接口实现

2.队列的头文件

3.测试代码


一、什么是队列?

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。可以形象地将队列想象成生活中的挤地铁,在挤地铁的时候我们只能够从后面进入队伍,出也只能够从队头出到地铁。总结:队列是只支持尾插头删的线性表。 

 二、创建一个我们自己的队列

1.前置准备

1.1需要的三个文件

在开始之前,我们最好创建三个文件,一个放栈函数的实现,一个用来测试栈函数,最后一个放栈函数的引用和头文件的引用,这样到时侯想要使用栈函数直接包这一个头文件即可。创建完之后,呈现出来的效果与下图差不多即可。

  1.2结构体的创建和头文件的引用

由于队列需要头删,使用数组实现的话最终呈现出来的效率十分低下,我们这里使用链表的方式实现,使用链表来实现线性表,头和尾是经常要用到的,同样队列的长度也很重要。因此我们创建两个结构体变量,一个结构体变量为链表的节点,一个结构体变量存放链表的头和尾以及队列的长度。

最终呈现出来的结果是这样的 

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int QueDateType;
//到时修改类型时只用改这里的一个就可以,不需要一个个修改
//同样,这也是为了和单一的int作区分
typedef struct QueueListNode
{struct QueueListnode* next;//存放下一个节点QueDateType data;//存放当前节点的数据
}Quenode;
typedef struct QueueInformation
{Quenode* head;//存放头节点Quenode* tail;//存放尾节点int sz;//存放个数
}Que;

2.接口的实现

2.1初始化队列

没什么好说的,将队列的两个指针变为空,存放个数的变量变为0即可

void init_queue(Que* q1)
{assert(q1);//q1存放的是结构体的指针,不应为空,为空操作不了q1->head = NULL;q1->tail = NULL;q1->sz = 0;
}

2.2入队

void push_queue(Que* q1, QueDateType x)
{assert(q1);//创建一个新节点,并初始化Quenode* newnode = (Quenode*)malloc(sizeof(Quenode));	if (newnode == NULL){perror("push_queue");exit(-1);}newnode->next = NULL;newnode->data = x;if (q1->head == NULL)//如果头为空,意味着还没有节点,单独处理{q1->head = q1->tail = newnode;}else{q1->tail->next = newnode;//原来的尾链接上新的尾q1->tail = newnode;//将尾更新}q1->sz++;
}

2.3队列元素个数和判空

可能有小伙伴不明白为什么又要设计这两个接口,因为这两个信息都可以直接通过队列的结构体获得,好像没什么作用啊。设计这两个接口并使用它们而不是直接通过结构体的内容来判断是因为,当我们的需求发生改变了,所创建的结构体可能也会跟着修改,可能提取的方式会发生一些改变   如果我们在使用队列的时候已经直接通过结构体的内容进行了多次的判断,那么我们要修改起来,要修改多次,很不方便,这样做的好处就是只用修改一次即可

队列元素个数

int size_queue(Que* q1)
{assert(q1);return q1->sz;
}

判空

int empty_queue(Que* q1)
{assert(q1);return q1->sz == 0;//相等即为空,返回1(真)//不相等即为非空,返回0(假)
}

 2.4取队头元素和队尾元素

这两个操作很相似,唯一要注意的就是,为空的时候不能取

取队头元素

QueDateType queue_front(Que* q1)
{assert(q1);assert(!empty_queue(q1));//队列不能是空return q1->head->data;
}

取队尾元素 


QueDateType queue_back(Que* q1)
{assert(q1);assert(!empty_queue(q1));//队列不能是空return q1->tail->data;
}

 2.5出队

需要注意的是,不能够删除空队列,其次我们删除到最后一个节点时要单独处理

void pop_queue(Que* q1)
{assert(q1);assert(!empty_queue(q1));if (q1->head->next == NULL)//最后一个节点单独处理//避免尾指针变野指针{free(q1->head);q1->head = NULL;q1->tail = NULL;}else{Quenode* next = q1->head->next;free(q1->head);q1->head = next;}q1->sz--;
}

 2.6摧毁队列

void destroy_queue(Que* q1)
{assert(q1);Quenode* cur = q1->head;while (cur){Quenode* next = cur->next;free(cur);cur = next;}
}

2.7测试接口

测试代码:

#include"queue.h"
void test1()
{Que q1;init_queue(&q1);push_queue(&q1, 1);push_queue(&q1, 2);push_queue(&q1, 3);push_queue(&q1, 4);push_queue(&q1, 5);printf("%d\n", queue_back(&q1));while (!empty_queue(&q1)){printf("%d ", queue_front(&q1));pop_queue(&q1);}destroy_queue(&q1);
}
int main()
{test1();
}

测试结果:

 三、所有代码

1.接口实现

#include"queue.h"
void init_queue(Que* q1)
{assert(q1);//q1存放的是结构体的指针,不应为空,为空操作不了q1->head = NULL;q1->tail = NULL;q1->sz = 0;
}
void push_queue(Que* q1, QueDateType x)
{assert(q1);//创建一个新节点,并初始化Quenode* newnode = (Quenode*)malloc(sizeof(Quenode));	if (newnode == NULL){perror("push_queue");exit(-1);}newnode->next = NULL;newnode->data = x;if (q1->head == NULL)//如果头为空,意味着还没有节点,单独处理{q1->head = q1->tail = newnode;}else{q1->tail->next = newnode;//原来的尾链接上新的尾q1->tail = newnode;//将尾更新}q1->sz++;
}
int size_queue(Que* q1)
{assert(q1);return q1->sz;
}
int empty_queue(Que* q1)
{assert(q1);return q1->sz == 0;//相等即为空,返回1(真)//不相等即为非空,返回0(假)
}
QueDateType queue_front(Que* q1)
{assert(q1);assert(!empty_queue(q1));//队列不能是空return q1->head->data;
}
QueDateType queue_back(Que* q1)
{assert(q1);assert(!empty_queue(q1));//队列不能是空return q1->tail->data;
}
void pop_queue(Que* q1)
{assert(q1);assert(!empty_queue(q1));if (q1->head->next == NULL)//最后一个节点单独处理//避免尾指针变野指针{free(q1->head);q1->head = NULL;q1->tail = NULL;}else{Quenode* next = q1->head->next;free(q1->head);q1->head = next;}q1->sz--;
}
void destroy_queue(Que* q1)
{assert(q1);Quenode* cur = q1->head;while (cur){Quenode* next = cur->next;free(cur);cur = next;}
}

2.队列的头文件

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int QueDateType;
//到时修改类型时只用改这里的一个就可以,不需要一个个修改
//同样,这也是为了和单一的int作区分
typedef struct QueueListNode
{struct QueueListnode* next;//存放下一个节点QueDateType data;//存放当前节点的数据
}Quenode;
typedef struct QueueInformation
{Quenode* head;//存放头节点Quenode* tail;//存放尾节点int sz;//存放个数
}Que;
void init_queue(Que* q1);
void push_queue(Que* q1, QueDateType x);
void pop_queue(Que* q1);
int size_queue(Que* q1);
int empty_queue(Que* q1);
QueDateType queue_front(Que* q1);
QueDateType queue_back(Que* q1);
void destroy_queue(Que* q1);

3.测试代码

#include"queue.h"
void test1()
{Que q1;init_queue(&q1);push_queue(&q1, 1);push_queue(&q1, 2);push_queue(&q1, 3);push_queue(&q1, 4);push_queue(&q1, 5);printf("%d\n", queue_back(&q1));while (!empty_queue(&q1)){printf("%d ", queue_front(&q1));pop_queue(&q1);}destroy_queue(&q1);
}
int main()
{test1();
}

好了,今天的分享到这里就结束了感谢各位友友的来访,祝各位友友前程似锦O(∩_∩)O

相关文章:

栈和队列详解(2)

目录 一、什么是队列&#xff1f; 二、创建一个我们自己的队列 1.前置准备 1.1需要的三个文件 1.2结构体的创建和头文件的引用 2.接口的实现 2.1初始化队列 2.2入队 2.3队列元素个数和判空 2.4取队头元素和队尾元素 2.5出队 2.6摧毁队列 2.7测试接口 三、所有代码 1.…...

EMC传导干扰滤波电路设计

1.EMC概念 2.EMC 传导干扰详解 EMC传导滤波电路的设计--传导干扰详解 3.EMC 传导干扰的测量方法 4.EMC 滤波电路设计 5.浪涌抑制电路设计 6.开关电源的安全要求 7.当前开关电源灯的应用...

【win10专业版远程控制】 自带远程桌面公司内网电脑

使用win10专业版自带远程桌面公司内网电脑 文章目录 使用win10专业版自带远程桌面公司内网电脑 在现代社会中&#xff0c;各类电子硬件已经遍布我们身边&#xff0c;除了应用在个人娱乐场景的消费类电子产品外&#xff0c;各项工作也离不开电脑的帮助&#xff0c;特别是涉及到数…...

Ubuntu 20.04 中安装docker一键安装脚本

直接上脚本&#xff0c;依次执行如下命令即可 wget http://apollo-pkg-beta.bj.bcebos.com/docker_install.sh bash docker_install.shdocker install docker operation system Ubuntu 18.04 直接上脚本&#xff0c;依次执行如下命令即可 ways1 : wget https://github.com…...

Mysql之安装-字符集设置-用户及权限操作-sqlmode设置

1、概述 MySQL支持大型数据库&#xff0c;支持5000万条记录的数据仓库&#xff0c;32位系统表文件最大可支持4GB&#xff0c;64位系统支持最大的表文件为8TB。使用标准的SQL数据语言形式。 2、Linux的mysql安装 &#xff08;1&#xff09;检查是否已安装&#xff1a;rpm -qa…...

腾讯云香港服务器租用价格_CN2线路延迟速度测试

腾讯云香港服务器&#xff0c;目前中国香港地域轻量应用服务器可选配置2核2G20M、2核2G30M、2核4G30M&#xff0c;操作系统可选Windows和Linux&#xff0c;不只是香港云服务器&#xff0c;新加坡、硅谷、法兰克福和东京服务器均有活动&#xff0c;腾讯云服务器网分享腾讯云境外…...

机器人静力学与刚度模型学习笔记

总算进行到刚度模型了。。。 ❤ 2023.8.6 ❤ 机器人静力学 学习资料 →→→【4-10机器人的静力分析】 机器人末端广义力 F [ f m ] [ f x f y f z m x m y m z ] F\left[\begin{matrix}f\\m\\\end{matrix}\right]\left[\begin{matrix}f_x\\f_y\\f_z\\m_x\\m_y\\m_z\\\end{…...

geeemap学习总结(1)——Anaconda-VSCode-geemap环境安装与配置

配置conda geemap 环境 通过Anaconda配置geemap环境较为方便&#xff0c;首先需在系统中完成 Anaconda安装。创建名为geemap的环境conda create -n geemap切换到新建的环境conda activate geemap安装geemap依赖包conda install -c conda-forge geemap 安装mambaconda install …...

.netcore grpc一元方法详解

一、grpc服务端搭建 打开visual studio--》新建项目--》创建ASP.NET Core gRPC服务。 这里我是用的.NET 6.0做为底层框架&#xff0c;使用该框架支持grpc的功能更全面。令注使用nuget包Grpc.AspNetCore这里我使用的是2.40.0版本。 // 创建dollar.proto文件syntax "prot…...

自学网络安全(黑客)全网详细路线

前言 web渗透是网络安全大行业里入门板块&#xff0c;就像十年前的软件&#xff0c;前景非常被看好&#xff0c;薪资也很诱人。与软件测试和前端开发只需掌握一定的编程能力不同的是&#xff0c;渗透需要掌握的知识内容较多&#xff0c;花费的时间较长&#xff0c;渗透测试掌握…...

上半年210个数字化大单,花落谁家?

2023年&#xff0c;各地数字化采购项目有怎样的进展&#xff1f;最近&#xff0c;我们通过中国政府采购网、中国招投标公共服务平台、天眼查、企查查等渠道&#xff0c;梳理了2023年上半年政企数字化项目的中标情况&#xff0c;并从中看到今年数字化项目的市场特点。 01 金融千…...

Integer.bitCount()

先看一道算法题&#xff1a; 剑指 Offer 15. 二进制中1的个数 编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中数字位数为 1 的个数&#xff08;也被称为 汉明重量).&#xff09;。 提示&#xff1a; …...

【Gitee的使用】Gitee的简单使用,查看/创建SSH公匙、创建版本库、拉取代码、提交代码

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 本篇文章简单介绍&#xff0c;如何在Gitee上面创建版本库、拉取…...

Java 跨平台多媒体处理样例

代码 import cn.hutool.core.exceptions.ExceptionUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.CharsetUtil; import lombok.extern.slf4j.Slf4j; import ws.schild.jave.Encoder; import ws.schild.jave.Multime…...

cmake基础(3)——安装

一、简介 install命令用于指定安装时的规则&#xff0c;由于安装命令比较复杂&#xff0c;这里做一部分内容的介绍&#xff0c;后续用到再继续完善。 1.命令简介 本文档基于3.20&#xff0c;目前有6种安装方式。 install(TARGETS <target>... [...]) install({FILES …...

​LeetCode解法汇总1572. 矩阵对角线元素的和

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 描述&#xff1a; 给你一个正…...

BFC(Block formatting context 块级格式化上下文)

1、开启了BFC能解决什么问题&#xff1f; 给父元素开启BFC&#xff0c;其子元素不会再产生 margin 塌陷问题。自己不会被其他浮动元素所覆盖。就算其子元素浮动&#xff0c;元素自身高度也不会塌陷。 2、如何开启&#xff1f; 根元素浮动元素绝对定位、固定定位的元素行内块…...

Leetcode-每日一题【剑指 Offer 14- II. 剪绳子 II】

题目 2、3、3的三段&#xff0c;此时得到的最大乘积是18。 答案需要取模 1e97&#xff08;1000000007&#xff09;&#xff0c;如计算初始结果为&#xff1a;1000000008&#xff0c;请返回 1。 示例 1&#xff1a; 输入: 2输出: 1解释: 2 1 1, 1 1 1 示例 2: 输入: 10输出…...

bye 我的博客网站

Bye&#x1f64b;&#x1f64b;&#x1f64b;&#xff0c;我的博客网站。在我的服务器上运行了9个月之久的博客网站要和大家Bye了。 背景 可能很多人不知道我的这个博客网站的存在&#xff0c;好吧&#xff0c;最后一次展示它了&#xff0c;博客网站地址在这里&#xff0c;它…...

Llama 2:开放基础和微调聊天模型

介绍 大型语言模型(llm)作为高能力的人工智能助手,在复杂的推理任务中表现出色,这些任务需要广泛领域的专家知识,包括编程和创意写作等专业领域。它们可以通过直观的聊天界面与人类进行交互,这在公众中得到了迅速而广泛的采用。 法学硕士的能力是显著的考虑到训练的表面上…...

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

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

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

【若依】框架项目部署笔记

参考【SpringBoot】【Vue】项目部署_no main manifest attribute, in springboot-0.0.1-sn-CSDN博客 多一个redis安装 准备工作&#xff1a; 压缩包下载&#xff1a;http://download.redis.io/releases 1. 上传压缩包&#xff0c;并进入压缩包所在目录&#xff0c;解压到目标…...

麒麟系统使用-进行.NET开发

文章目录 前言一、搭建dotnet环境1.获取相关资源2.配置dotnet 二、使用dotnet三、其他说明总结 前言 麒麟系统的内核是基于linux的&#xff0c;如果需要进行.NET开发&#xff0c;则需要安装特定的应用。由于NET Framework 是仅适用于 Windows 版本的 .NET&#xff0c;所以要进…...