数据结构----栈和队列之队列的实现

目录

1.基本概况

2.队列组成

3.队列的实现

(1)队列的初始化

(2)队列的销毁

(3)队列的尾插

(4)队列的头删

(5)队列的判空

(6)队列的元素个数

(7)返回头部节点

(8)返回尾部节点

4.完整代码

(1)头文件

(2)源文件

(3)测试文件


1.基本概况

(1)我们之前学习了栈,栈就是先进入,后出来,后进先出,然后使用这个特性解决了括号的匹配问题;

(2)队列就是先进先出,而且是从一头进入,从另外一头出去,栈分为入栈和出栈,队列里面也是分为入队和出队两个部分;

2.队列组成

(1)队列里面的每一个数据也是有自己的next指针和val数值的,但是我们在实现这个在队尾队头插入数据的时候,这个传入这个队头的指针和队尾的指针,而且是二级指针,为什么要传递二级指针,因为我们本身传递的参数就是一个指针,通过这个指针,函数实现的时候才可以找到这个队列的头部尾部节点,我们经过这个插入和删除之后,这个形参的修改时需要同步到实参,但是如果我们传递这个一级指针,就没有办法实现这一点,因此,我们需要传递二级指针;

(2)为什么进行队尾和队头的插入和删除的时候,参数里面是两个指针,一个是头指针,一个是尾指针,插入数据的时候还需要给一个变量作为第三个参数;

(3)这个地方,为了简单起见,我们决定再去定义一个结构体,存放这个头结点和尾结点,这个时候,我们就定义了两个结构体,第一个结构体表示的是每一个节点,这个节点里面包括了这个next指针和val数值,第二个结构体里面包含这个队列的头指针和尾指针;

(4)定义了两个结构体之后,我们就可以把这个结构体作为参数进行传递,因为我们的这个结构体里面是两个一级指针,我们传递参数的时候只需要把这个结构体的指针传递进行就可以了,这个结构体里面就包含了队列的头指针和尾指针;

3.队列的实现

(1)队列的初始化

就是先去断言,然后把这个队列的头尾指针全部置为空指针,节点的个数初始化为0;

(2)队列的销毁

使用循环语句,不断的释放每一个节点,最后再让这个phead和ptail全部置空;

(3)队列的尾插

我们知道这个队列里面的数据都是从队尾进入,所以这个push也是从队尾去插入数据,我们需要手动的开辟新的节点空间;

如果这个队列本来就是空的,这个时候队列的头节点和尾结点都是newnode,否则的话,这个头结点不变,尾结点更新一下就可以了,使用if  else实现这个功能;

(4)队列的头删

我们的队列里面的数据从头部出来,简称头部删除,我们需要判断这个队列里面的元素的个数,如果这个队列里面只有一个节点,这个时候ptail和phead都是指向的这个节点,我们把任意的一个空间释放掉,另外一个就会变成野指针;

因此我们进行判断,如果只有一个节点,释放完空间之后,把这个ptail和phead都置为空指针;否则就把这个next节点记录下来,删除旧的节点之后,让我们的next成为新的头结点;

(5)队列的判空

直接判断这个pq->size==0即可,如果是0,就说明这个队列里面没有数据,返回值bool就是0,有数据的话就返回的是1;

(6)队列的元素个数

pq->size就是这个队列里面的节点的个数,直接返回即可;

(7)返回头部节点

返回头部节点,pq这个队列不可以是空的,而且这个队列的头结点不可以是空的,否则我们的这个目的就无法达到;

(8)返回尾部节点

返回尾部节点,这个队列不可以是空的,而且这个队列的尾部节点不可以是空的,否则无法找到这个节点里面的val数值;

4.完整代码

(1)头文件

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>
typedef int qdatatype;typedef struct quenenode
{struct quenenode* next;qdatatype val;
}qnode;//队列的一个特点就是先进先出,后进后出typedef struct quene
{qnode* phead;qnode* ptail;int size;
}quene;void queneinit(quene* pq);void quenedestory(quene* pq);void quenepush(quene* pq, qdatatype x);qdatatype queneback(quene* pq);qdatatype quenefront(quene* pq);int quenesize(quene* pq);bool queneempty(quene* pq);

(2)源文件

#define _CRT_SECURE_NO_WARNINGS 1
#include"quene.h"void queneinit(quene* pq)
{assert(pq);pq->phead = NULL;pq->ptail = NULL;pq->size = 0;
}void quenedestory(quene* pq)
{assert(pq);qnode* cur = pq->phead;while (cur){qnode* next = cur->next;free(cur);cur = next;}pq->phead = pq->ptail = NULL;
}void quenepush(quene* pq, qdatatype x)
{assert(pq);qnode* newnode = (qnode*)malloc(sizeof(qnode));if (newnode == NULL){perror("malloc fail!");return;}newnode->next = NULL;newnode->val = x;if (pq->ptail == NULL){pq->ptail = pq->phead = newnode;}else{pq->ptail->next = newnode;pq->ptail = newnode;}pq->size++;
}
//出队列,从头部删除数据
void quenepop(quene* pq)
{assert(pq);if (pq->phead->next == NULL){free(pq->phead);pq->phead = pq->ptail = NULL;}else{qnode* next = pq->phead->next;free(pq->phead);pq->phead = next;}pq->size--;
}qdatatype queneback(quene* pq)
{assert(pq);assert(pq->ptail);return pq->ptail->val;
}qdatatype quenefront(quene* pq)
{assert(pq);assert(pq->phead);return pq->phead->val;
}int quenesize(quene* pq)
{assert(pq);return pq->size;
}bool queneempty(quene* pq)
{assert(pq);return pq->size == 0;
}

(3)测试文件

#define _CRT_SECURE_NO_WARNINGS 1
#include"quene.h"
void test01()
{quene q;queneinit(&q);quenepush(&q, 1);quenepush(&q, 2);quenepush(&q, 3);quenepush(&q, 4);while (!queneempty(&q)){printf("%d ", quenefront(&q));quenepop(&q);}printf("\n");
}
int main()
{test01();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/865294.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

外挂级OCR神器:免费文档解析、表格识别、手写识别、古籍识别、PDF转Word

智能文档解析&#xff1a;大模型友好的文档解析工具 PDF转Markdown 支持将任意格式的文件&#xff08;图片、PDF、Doc&#xff0f;Docx、网页等&#xff09;解析为Markdown或Json格式&#xff0c;以对LLM友好的方式呈现。 更高速度&#xff1a;100页PDF最快1.5s完成解析 更大…

SAR目标检测

Multi-Stage with Filter Augmentation 多阶段滤波器增强(MSFA) 对SAR合成孔径雷达目标检测性能的改善 MSFA ON SAR 传统方法: 预训练:传统方法开始于在通用数据集上预训练一个基础模型。 微调:这个预训练的模型会被微调以适应特定的SAR图像&#xff0c;试图缩小域间的差距 …

【JAVA多线程】JDK中的各种锁,看这一篇就够了

目录 1.概论 1.1.实现锁的要素 1.2.阻塞队列 1.3.Lock接口和Sync类 2.各种锁 2.1.互斥锁 2.1.1.概论 2.1.2.源码 1.lock() 2.unlock() 2.2.读写锁 2.3.Condition 2.3.1.概论 2.3.2.底层实现 1.概论 1.1.实现锁的要素 JAVA中的锁都是可重入的锁&#xff0c;因为…

苹果再出新招:macOS15 Beta2预览版更新,居然还有iPhone镜像功能

在数字化时代&#xff0c;操作系统的更新迭代是技术进步的显著标志。苹果公司以其一贯的创新精神&#xff0c;不断推动着个人计算体验的边界。 2024年6月25日&#xff0c;苹果公司向Mac电脑用户推出了macOS 15开发者预览版Beta 2更新&#xff0c;这不仅是对macOS系统的一次重大…

【探索Linux】P.36(传输层 —— TCP协议段格式)

阅读导航 引言一、TCP段的基本格式二、控制位详细介绍三、16位接收窗口大小⭕窗口大小的作用⭕窗口大小的限制⭕窗口缩放选项⭕窗口大小的更新⭕窗口大小与拥塞控制 四、紧急指针温馨提示 引言 在上一篇文章中&#xff0c;我们深入探讨了一种无连接的UDP协议&#xff0c;它以其…

14-14 商业领域的人工智能革命

在商业技术领域&#xff0c;对话式人工智能已获得广泛认可和使用&#xff0c;产生了重大而直接的影响。GPT-2 和 GPT-3 等大型语言模型一直是该领域的基础&#xff0c;但它们的高级继任者将对话界面推向了新的高度。这些较新的模型不仅仅是处理输入&#xff1b;它们旨在完美地集…

RK3568驱动指南|第十六篇 SPI-第188章 mcp2515驱动编写:复位函数

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

[数据结构] --- 树

1 树的基本概念 1.1 树的定义 树是n(n>0)个结点的有限集。当 n 0 时&#xff0c;称为空树。在任意一棵树非空树中应满足&#xff1a; (1) 有且仅有一个特定的称为根 (root) 的结点&#xff1b; (2) 当 n > 1 时&#xff0c;其余结点可分为m(m>0)个互不相交的有限集…

GDB 远程调试简介

文章目录 1. 前言2. GDB 远程调试2.1 准备工作2.1.1 准备 客户端 gdb 程序2.1.2 准备 服务端 gdbserver2.1.3 准备 被调试程序 2.2 调试2.2.1 通过网络远程调试2.2.1.1 通过 gdbserver 直接启动程序调试2.2.1.2 通过 gdbserver 挂接到已运行程序调试 2.2.2 通过串口远程调试2.2…

如何快速申请免费SSL证书,实现网站HTTPS安全传输

随着互联网技术的飞速发展&#xff0c;网络安全已成为不可忽视的重要议题。HTTPS协议&#xff0c;作为HTTP协议的安全版本&#xff0c;通过SSL协议加密客户端与服务器之间的数据传输&#xff0c;从而保障信息在传输过程中的安全性。对于网站运营者而言&#xff0c;为网站部署SS…

违规停放智能监测摄像机

对于现代城市管理来说&#xff0c;违规停放智能监测摄像机正逐渐成为解决交通拥堵和城市管理难题的重要工具。这类摄像机通过先进的视觉识别和数据分析技术&#xff0c;有效监控和管理道路上的车辆停放行为&#xff0c;对提升城市交通运行效率和改善市民出行环境具有显著的意义…

三代测序PacBioONT reads过滤和修剪-Chooper

chopper简介 chopper是NanoFilt和NanoLyse的Rust语言版本&#xff0c;适用于长reads测序&#xff08;如PacBio和纳米孔测序ONT&#xff09;的过滤和修剪fastq文件。 chopper相对于python编写的NanoFilt和NanoLyse&#xff0c;运行输出相同结果的时间更短&#xff0c;且NanoFi…

思维,CF 739A - Alyona and mex

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 739A - Alyona and mex 二、解题报告 1、思路分析 我们考虑区间mex运算的值最大也就是区间长度&#xff0c;所以我们最大值的上界就是所有区间中的最小长度&#xff0c;假如记为mi 我们一定可以构造出答案…

zabbix 配置钉钉告警

1.申请一个钉钉企业版 2.群内申请一个机器人 下载电脑版钉钉&#xff0c;登录后&#xff0c;在要接收群消息的群里&#xff0c;点击右上角设置图标&#xff0c;下滑找到机器人&#xff0c;添加一个机器人&#xff0c;保存机器人的webhook地址 保存这里的加签字符串 保存这里的…

通信软件开发之业务知识:PON口割接什么意思?

一 PON口割接&#xff08;原创总结&#xff09; 在通信领域&#xff0c;PON口割接指的是对无源光网络&#xff08;Passive Optical Network&#xff0c;PON&#xff09;端口进行的切换或调整操作。简单来说&#xff0c;就是对光纤网络中的某个端口进行重新连接或重新分配&…

153. 寻找旋转排序数组中的最小值(中等)

153. 寻找旋转排序数组中的最小值 1. 题目描述2.详细题解3.代码实现3.1 Python3.2 Java 1. 题目描述 题目中转&#xff1a;153. 寻找旋转排序数组中的最小值 2.详细题解 如果不考虑 O ( l o g n ) O(log n) O(logn)的时间复杂度&#xff0c;直接 O ( n ) O(n) O(n)时间复杂…

【Hugging Face全面拥抱LangChain:全新官方合作包】

文末有福利&#xff01; ❝ 最近Hugging Face官宣发布langchain_huggingface&#xff0c;这是一个由 Hugging Face 和 LangChain 共同维护的 LangChain 合作伙伴包。这个新的 Python 包旨在将 Hugging Face 最新功能引入 LangChain 并保持同步。 通过Hugging Face官方包的加持&…

14-15 为什么我们现在对阅读如此难以接受

写出来感觉很奇怪&#xff0c;但最近我感觉自己失去了阅读能力。长篇文本对我来说尤其具有挑战性。句子很难读完。更别提章节了。章节有很多段落&#xff0c;而段落又由许多句子组成。 啊。 即使在极少数情况下&#xff0c;我读完了一章&#xff0c;下一页上已经有另一章等着…

有sdwan可以不用专线吗?sdwan和专线的区别优势

SD-WAN&#xff08;Software-Defined Wide Area Network&#xff0c;软件定义广域网&#xff09;确实可以在很大程度上替代传统的专线连接&#xff0c;尤其是在追求成本效益和网络灵活性的场景下。SD-WAN的核心优势在于其智能化和自动化的能力&#xff0c;这使得它能够优化数据…

华清远见人工智能课程:项目优势助力,学习更高效!

在人工智能飞速发展的今天&#xff0c;学习人工智能成为新的高薪赛道。我们都知道人工智能的学习离不开项目练手&#xff0c;只有通过实际项目的操作&#xff0c;才能真正掌握人工智能的核心技能。但遗憾的是&#xff0c;很多人工智能课程只注重理论知识的传授&#xff0c;缺乏…