【数据结构】栈和队列(下)

article/2025/8/28 16:51:26

目录

一、队列(先进先出的特殊结构)

队列的概念与结构

二、代码实现

1、定义队列的结构

2、队列的初始化操作

3、判空操作

4、入队操作

5、出队操作

6、取队头、队尾操作

7、队列销毁操作

8、队列中有效数据个数

9、测试代码

10、.h文件


一、队列(先进先出的特殊结构)

队列的概念与结构

队列:只允许在一端进行插入数据数据操作,在另一端进行删除数据的特殊线性表,队列具有先进先出的结构

同栈一样,我们先来讨论一下队列的底层结构该如何选型?

首先我们来看一下数组的结构,如果将数组当做队列底层的结构,那么入队列操作的时间复杂度为O(1),由于出队列操作,数组要删除头部的数据,那么数组头部之后的数据就要整体向前挪动一位,所以出队列的时间复杂度为O(N);若将队尾与队头对调,他们的时间复杂度将对调。

其次,我们来考虑链表结构,以单链表为例,假设链表的头为队头,链表的尾为队尾,队头用来出数据,时间复杂度为O(1),队尾用来入数据,由于每次入数据都要遍历找到尾结点,所以时间复杂度为O(N),如果将队头队尾对调,他们的时间复杂度也将对调。

那么,既然这样,我们就要想一些法子,来减少时间复杂度:

如果用双向链表可不可行呢?这个问题值得思考,假设使用双向链表,对头的prev指针指向队尾,但是每一个结点除去原有的数据,还要存储两个指针类型的数据,如果是32字节的系统,假设是整型数据,int类型数据占4个字节,两个地址占4*2=8字节,4+8=12字节,考虑内存对齐,共消耗了16字节的空间,这个数据过于庞大,所以我们不再考虑双向链表。

下面,我们考虑优化链表的时间复杂度来实现队列的底层结构。

如果是链表头结点为队头,即入队时间复杂度为O(1),出队时间复杂度为O(N)的情况,我们可以用定义两个指针,分别记录队头和队尾:phead、ptail,来将出队操作的时间复杂度降为O(1)。

从此处我们可以得出一个结论,队列的逻辑结构是线性的,而物理结构不一定是线性的。

二、代码实现

下面,我们来准备一下队列的代码实现:

1、定义队列的结构

//定义结点的结构
typedef int QueueDataType;
typedef struct QueueNode
{QueueDataType data;struct QueueNode* next;
}QueueNode;//定义队列的结构
typedef struct Queue
{QueueNode* phead;QueueNode* ptail;
}Queue;

2、队列的初始化操作

Void QueueInit(Queue*pq)
{assert(pq);pq->phead = pq->ptail = NULL;
}

3、判空操作

bool QueueEmpty(Queue*pq)
{assert(pq);return pq->phead == NULL;
}

4、入队操作

Void QueuePush(Queue* pq,QueueDataType x)
{assert(pq);QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueDataType));if(newnode == NULL){perror("malloc failed!");exit(1);}newnode->data = x;newnode->next = NULL;if(QueueEmpty(pq))//考虑队列为空的情况{pq->phead = pq->ptail = newnode;}else{//队列非空pq->ptail->next = newnode;pq->ptail = pq->ptail->next;}
}

5、出队操作

void QueuePop(Queue* pq)
{assert(!QueueEmpty(pq));if(pq->phead == pq->ptail){//只有一个结点free(pq->phead);pq->phead = pq->ptail = NULL;   }else{QueueNode* next = pq->phead->next;free(pq->phead);pq->phead = next;}
}

6、取队头、队尾操作

//取队头
QueueDataType QueueFront(Queue* pq)
{assert(pq);return pq->phead->data;
}
//取队尾
QueueDataType QueueBack(Queue* pq)
{assert(pq);return pq->ptail->data;
}

7、队列销毁操作

//销毁队列
void QueueDestory(Queue* pq)
{assert(pq);QueueNode* pcur = pq->phead;while (pcur){QueueNode* next = pcur->next;free(pcur);pcur = next;}pq->phead = pq->ptail = NULL;
}

8、队列中有效数据个数

//队列有效数据个数
int QueueSize(Queue* pq)
{assert(pq);QueueNode* pcur = pq->phead;int size = 0;while (pcur){size++;pcur = pcur->next;}return size;
}

这里的时间复杂度为O(N),仅适用于不频繁调用有效数据个数的情况,如果想优化这则代码,我们可以在对列中定义一个整型的size,如果写了size,那么我们在入队列时,size要++,出队列时,size要--,销毁时,size要置为0。

9、测试代码

#define  _CRT_SECURE_NO_WARNINGS 1
#include"Queue.h"void test01()
{Queue q;QueueInit(&q);QueuePush(&q, 1); QueuePush(&q, 2); QueuePush(&q, 3); //QueuePush(&q, 4); //QueuePop(&q);int front = QueueFront(&q);int rear = QueueBack(&q);int size = QueueSize(&q);printf("front = %d\n", front);printf("rear = %d\n", rear);printf("size = %d\n", size);
}int main()
{test01();return 0;
}

10、.h文件

#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>//定义结点的结构
typedef int QueueDataType;
typedef struct QueueNode
{QueueDataType data;struct QueueNode* next;
}QueueNode;//定义队列的结构
typedef struct Queue
{QueueNode* phead;QueueNode* ptail;//int size;
}Queue;//队列的初始化
void QueueInit(Queue* q);//入队,队尾
void QueuePush(Queue* pq, QueueDataType x);//出队,队头
void QueuePop(Queue* pq);//取队头操作
QueueDataType QueueFront(Queue* pq);//取队尾操作
QueueDataType QueueBack(Queue* pq);//销毁队列
void QueueDestory(Queue* pq);//有限数据个数
int QueueSize(Queue* pq);


http://www.hkcw.cn/article/LwlWQISCop.shtml

相关文章

基于卫星遥感数据识别互花米草及原生植被分布及生长的技术原理、关键方法

通过卫星遥感监测生态保护红线&#xff0c;基于卫星遥感数据识别互花米草及原生植被&#xff08;如芦苇&#xff09;的分布、面积及生长状况&#xff0c;主要利用不同植被类型的光谱特征差异、物候周期差异和遥感影像处理技术实现。 上星图地球开放平台获取更多生态保护解决方案…

可视化图解算法47:包含min函数的栈

1. 题目 牛客网 面试笔试 TOP101 | LeetCode 155. 最小栈 描述 定义栈的数据结构&#xff0c;请在该类型中实现一个能够得到栈中所含最小元素的 min 函数&#xff0c;输入操作时保证 pop、top 和 min 函数操作时&#xff0c;栈中一定有元素。 此栈包含的方法有&#x…

windows系统下通过visual studio使用clang tooling

vs吃上clang tooling 通过源码编译clang安装必备软件GnuWin32 Tools&#xff1a; 拉取/下载git仓库编译 在项目中使用clangTool 通过源码编译clang 教程参考安装教程 作者本人亲身使用流程&#xff1a; 安装必备软件 Git&#xff1a;作者已经有了&#xff0c;自己查CMake&am…

路由器、网关和光猫三种设备有啥区别?

无论是家中Wi-Fi信号的覆盖&#xff0c;还是企业网络的高效运行&#xff0c;路由器、网关和光猫这些设备都扮演着不可或缺的角色。然而&#xff0c;对于大多数人来说&#xff0c;这三者的功能和区别却像一团迷雾&#xff0c;似懂非懂。你是否曾疑惑&#xff0c;为什么家里需要光…

攻防世界János-the-Ripper

打开压缩包是一个文件&#xff0c;用010Editor打开可以发现里面有隐藏文件flag.txt 此时想到分离文件&#xff0c;利用binwalk工具 利用binwalk生成出的是一个压缩包&#xff0c;解压缩但是发现竟然解压需要密码 这里就可以开始暴力破解密码了&#xff0c;这里我用的是ARCHPR工…

酷派Cool20/20S/30/40手机安装Play商店-谷歌三件套-GMS方法

酷派Cool系列主打低端市场&#xff0c;系统无任何GMS程序&#xff0c;也不支持直接开启或者安装谷歌服务等功能&#xff0c;对于国内部分经常使用谷歌服务商店的小伙伴非常不友好。涉及机型有酷派Cool20/Cool20S /30/40/50/60等旗下多个设备。好在这些机型运行的系统都是安卓11…

本地部署大模型llm+RAG向量检索问答系统 deepseek chatgpt

项目视频讲解: 本地部署大模型llm+RAG向量检索问答系统 deepseek chatgpt_哔哩哔哩_bilibili 运行结果:

并查集 c++函数的值传递和引用传递 晴神问

目录 学校的班级个数 手推7个班级&#xff0c;答案17&#xff1f;怀疑人生 破案了&#xff0c;应该是6个班。 破案了&#xff0c;原来写的是 unionxy(a, b, father); c if两个数同时为正或为负 简洁写法 可以用位运算&#xff1f; c可以这样赋值吗&#xff1f;ab2 典型…

Dynamics 365 Business Central AI Sales Order Agent Copilot

#AI Copilot# #D365 BC 26 Wave# 最近很多客户都陆续升级到 Dynamics 365 Business Central 26 wave, Microsoft 提供一个基于Copilot 的Sales Order Agent&#xff0c;此文将此功能做个介绍. Explorer: 可以看到26版本上面增加了这样一个新图标。 Configuration: 配置过程…

Webug4.0靶场通关笔记03- 第3关SQL注入之时间盲注(手注法+脚本法 两种方法)

目录 一、源码分析 1.分析闭合 2.分析输出 &#xff08;1&#xff09;查询成功 &#xff08;2&#xff09;查询失败 &#xff08;3&#xff09;SQL语句执行报错 二、第03关 延时注入 1.打开靶场 2.SQL手注 &#xff08;1&#xff09;盲注分析 &#xff08;2&#xf…

NodeJS 基于 Koa, 开发一个读取文件,并返回给客户端文件下载,以及读取文件形成列表和文件删除的代码演示

前言 在上一篇文章 《Nodejs 实现 Mysql 数据库的全量备份的代码演示》 中&#xff0c;我们演示了如何将用户的 Mysql 数据库进行备份的代码。但是&#xff0c;这个备份&#xff0c;只是备份在了服务器上了。 而我们用户的真实需求&#xff0c;是需要将备份文件下载到本地进行…

中国自然灾害影响及损失数据

自然灾害往往会导致大量的人员伤亡和财产损失&#xff0c;数据集详细记载了2014-2020年中国自然灾害影响以及灾害造成的损失情况。其中包括地震、台风、雨雪、阵雨、雪灾、暴雨、旱灾、龙卷风、泥石流、山崩、泥石流、滑坡、洪涝等灾害事件。 数据集主要以excel的格式存储。属性…

UE5.5 pixelstreaming插件打包报错

文章目录 错误内容如下解决方案推流服务器不能使用 错误内容如下 The following files are set to be staged, but contain restricted folder names ("Linux"): CTZ5_5/Samples/PixelStreaming/WebServers/Extras/FrontendTests/dockerfiles/linux/Dockerfile CTZ5…

UE5打包项目设置Project Settings(打包widows exe安装包)

UE5打包项目Project Settings Edit-Project Settings- Packaging-Ini Section Denylist-Advanced 1&#xff1a;打包 2&#xff1a;高级设置 3&#xff1a;勾选创建压缩包 4&#xff1a;添加要打包地图Map的数量 5&#xff1a;选择要打包的地图Maps 6&#xff1a;Project-Bui…

全志F1c200开发笔记——移植Debian文件系统

1.搭建环境 sudo apt install qemu-user-static -y sudo apt install debootstrap -y mkdir rootfs 2.拉取文件系统 这边我参照墨云大神的文档&#xff0c;但是华为镜像已经没有armel了&#xff0c;我找到了官方仓库&#xff0c;还是有的&#xff0c;拉取速度比较慢 sudo d…

多模态大语言模型arxiv论文略读(九十九)

PartGLEE: A Foundation Model for Recognizing and Parsing Any Objects ➡️ 论文标题&#xff1a;PartGLEE: A Foundation Model for Recognizing and Parsing Any Objects ➡️ 论文作者&#xff1a;Junyi Li, Junfeng Wu, Weizhi Zhao, Song Bai, Xiang Bai ➡️ 研究机构…

SpringCloud基础知识

学习视频链接:SpringCloud | 黑马程序员 文章目录 NacosDocker部署1.拉取镜像2.运行nacos3.测试 Nacos介绍核心功能&#xff1a;基本概念&#xff1a;部署模式&#xff1a;1.单机模式&#xff08;Standalone&#xff09;2.集群模式&#xff08;Cluster&#xff09;3.云原生部署…

12-后端Web实战(登录认证)

在前面的课程中&#xff0c;我们已经实现了部门管理、员工管理的基本功能&#xff0c;但是大家会发现&#xff0c;我们并没有登录&#xff0c;就直接访问到了Tlias智能学习辅助系统的后台。 这是不安全的&#xff0c;所以我们今天的主题就是登录认证。最终要实现的效果是&#…

CppCon 2014 学习第4天:Transactional Language Constructs for C++ TS(未进入到标准)

事务性编程 “Transactional Language Constructs for C TS”指的是在C技术规范&#xff08;Technical Specification, TS&#xff09;中提出的一套用于支持**事务性编程&#xff08;Transactional Programming&#xff09;**的语言构造。 什么是事务性编程&#xff1f; 事务…

【论文阅读】《PEACE: Empowering Geologic Map Holistic Understanding with MLLMs》

目录 前言一、研究背景与问题1-1、地质图的重要性1-2、现有MLLMs的不足 二、 主要贡献2-1、GeoMap-Bench&#xff1a;首个地质图理解评估基准2-2、GeoMap-Agent&#xff1a;首个地质图专用AI代理2-3、实验验证与性能优势 三、关键技术3-1、 数据构建与预处理3-2、分层信息提取&…