栈和队列详解(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)
目录 一、什么是队列? 二、创建一个我们自己的队列 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专业版自带远程桌面公司内网电脑 在现代社会中,各类电子硬件已经遍布我们身边,除了应用在个人娱乐场景的消费类电子产品外,各项工作也离不开电脑的帮助,特别是涉及到数…...
Ubuntu 20.04 中安装docker一键安装脚本
直接上脚本,依次执行如下命令即可 wget http://apollo-pkg-beta.bj.bcebos.com/docker_install.sh bash docker_install.shdocker install docker operation system Ubuntu 18.04 直接上脚本,依次执行如下命令即可 ways1 : wget https://github.com…...
Mysql之安装-字符集设置-用户及权限操作-sqlmode设置
1、概述 MySQL支持大型数据库,支持5000万条记录的数据仓库,32位系统表文件最大可支持4GB,64位系统支持最大的表文件为8TB。使用标准的SQL数据语言形式。 2、Linux的mysql安装 (1)检查是否已安装:rpm -qa…...

腾讯云香港服务器租用价格_CN2线路延迟速度测试
腾讯云香港服务器,目前中国香港地域轻量应用服务器可选配置2核2G20M、2核2G30M、2核4G30M,操作系统可选Windows和Linux,不只是香港云服务器,新加坡、硅谷、法兰克福和东京服务器均有活动,腾讯云服务器网分享腾讯云境外…...
机器人静力学与刚度模型学习笔记
总算进行到刚度模型了。。。 ❤ 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环境较为方便,首先需在系统中完成 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做为底层框架,使用该框架支持grpc的功能更全面。令注使用nuget包Grpc.AspNetCore这里我使用的是2.40.0版本。 // 创建dollar.proto文件syntax "prot…...

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

上半年210个数字化大单,花落谁家?
2023年,各地数字化采购项目有怎样的进展?最近,我们通过中国政府采购网、中国招投标公共服务平台、天眼查、企查查等渠道,梳理了2023年上半年政企数字化项目的中标情况,并从中看到今年数字化项目的市场特点。 01 金融千…...
Integer.bitCount()
先看一道算法题: 剑指 Offer 15. 二进制中1的个数 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 1 的个数(也被称为 汉明重量).)。 提示: …...

【Gitee的使用】Gitee的简单使用,查看/创建SSH公匙、创建版本库、拉取代码、提交代码
推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 本篇文章简单介绍,如何在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命令用于指定安装时的规则,由于安装命令比较复杂,这里做一部分内容的介绍,后续用到再继续完善。 1.命令简介 本文档基于3.20,目前有6种安装方式。 install(TARGETS <target>... [...]) install({FILES …...

LeetCode解法汇总1572. 矩阵对角线元素的和
目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 描述: 给你一个正…...
BFC(Block formatting context 块级格式化上下文)
1、开启了BFC能解决什么问题? 给父元素开启BFC,其子元素不会再产生 margin 塌陷问题。自己不会被其他浮动元素所覆盖。就算其子元素浮动,元素自身高度也不会塌陷。 2、如何开启? 根元素浮动元素绝对定位、固定定位的元素行内块…...

Leetcode-每日一题【剑指 Offer 14- II. 剪绳子 II】
题目 2、3、3的三段,此时得到的最大乘积是18。 答案需要取模 1e97(1000000007),如计算初始结果为:1000000008,请返回 1。 示例 1: 输入: 2输出: 1解释: 2 1 1, 1 1 1 示例 2: 输入: 10输出…...

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

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

深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...

GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...