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

目录

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,一经查实,立即删除!

相关文章

Java项目总结1

1.什么是面向对象&#xff08;此对象非彼对象&#xff09; “面向对象的方法主要是把事物给对象化&#xff0c;包括其属性和行为。面向对象编程更贴近实际生活的思想。总体来说面向对象的底层还是面向过程&#xff0c;面向过程抽象成类&#xff0c;然后封装&#xff0c;方便使用…

外挂级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;试图缩小域间的差距 …

selector实现按钮选中高亮效果原理

<?xml version"1.0" encoding"utf-8"?> <selector xmlns:android"http://schemas.android.com/apk/res/android"> <item android:state_pressed"true" android:drawable"drawable/background_press…

【Pytorch实用教程】如何在多个GPU上使用分布式数据并行进行训练模型

文章目录 1. 代码(可直接运行,含随机生成的训练数据)2. 代码的详细解释2.1. 导入必要的库和模块2.2. 设置每个进程的初始设置2.3. 随机生成数据集类 `RandomDataset`2.4. 训练函数 `train`1. 代码(可直接运行,含随机生成的训练数据) 以下是一个基于PyTorch的多GPU分布式…

【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;因为…

PHP 使用RabbitMq推送消息

use PhpAmqpLib\Connection\AMQPStreamConnection; use PhpAmqpLib\Message\AMQPMessage;config.php 文件 "order_dispose" > ["routingKey" > "xxx","name" > "xxx",//"class" > \app\rmq\pull\xxx…

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

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

logback janinoEventEvaluator expression 实例

参考&#xff1a;logback 日志 mysql logback 日志过滤_mob64ca140d2323的技术博客_51CTO博客 <!-- 控制台日志配置 --><appender name"CONSOLE" class"ch.qos.logback.core.ConsoleAppender"><filter class"ch.qos.logback.core.fil…

RSA加密中可加密数据的长度

在RSA加密算法中&#xff0c;要编码的最大块大小取决于所选择的密钥长度。一般来说&#xff0c;RSA密钥长度可以是1024位、2048位或者4096位。 对于1024位密钥&#xff0c;最大块大小为117字节。这意味着&#xff0c;当使用1024位密钥时&#xff0c;您可以加密的最大数据块为1…

Linux开发:fork进程时避免产生僵尸进程

僵尸进程是指fork后的子进程在完成自己的工作后退出了,但是父进程却没有通过wait/waitpid获取子进程的退出码,这时子进程的资源还不能完全释放,因为需要等待父进程的回收,这时子进程就成为了僵尸进程: #include <iostream> #include <sys/types.h> #include …

【探索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;可用于轻量级人工…

Python 学习中,什么是字符串,如何处理字符串?

1. 什么是字符串 在Python中&#xff0c;字符串&#xff08;String&#xff09;是一种数据类型&#xff0c;用于表示文本数据。字符串由一系列字符组成&#xff0c;可以包括字母、数字、符号和空格等。字符串在Python中使用单引号&#xff08;&#xff09;或双引号&#xff08…

[数据结构] --- 树

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…

Stream toArray 好过collect

toArray 比collect 更好用&#xff0c;这样就不需要判断Null。 if(_user.getUserRole()!null) {_user.setRole(_roleList.stream().filter(_e->_e.getRoleId()_user.getUserRole()).toArray(Role[]::new)[0]); } if(_user.getUserRole()!null) {_user.setRole(_roleList.s…

违规停放智能监测摄像机

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