栈和队列(数据结构初阶)

devtools/2025/1/20 4:13:25/

文章目录

  • 栈和队列
    • 一:栈
      • 1.1概念与结构
      • 1.2底层逻辑
      • 1.3栈的实现
        • 结构定义
        • 判空
        • 入栈
        • 出栈
        • 取栈顶元素
        • 获取栈中有效数据个数
    • 二:队列
      • 2.1概念与结构
      • 2.2底层逻辑
      • 2.3 队列的实现
        • 结构定义
        • 初始化
        • 入队
        • 判空
        • 出队
        • 取数据
        • 有效数据个数
    • 三:结语

欢迎大家来到我的博客,给生活加点impetus!!!
在这里插入图片描述
今天我们学习栈和队列

栈和队列

一:栈

1.1概念与结构

栈:⼀种特殊的线性表,其只允许在固定的⼀端进⾏插⼊和删除元素操作。进⾏数据插⼊和删除操作的⼀端称为栈顶,另⼀端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
压栈栈的插⼊操作叫做进栈/压栈/⼊栈⼊数据在栈顶
出栈栈的删除操作叫做出栈。出数据也在栈顶

理解后进先出法则

在这里插入图片描述
1要出来的话必须先让2和3出来,2要出来的话必须先让3出来。

先进后出或者后进先出

1.2底层逻辑

在前面我们已经介绍了线性表。
栈在逻辑结构上一定是连续的,那物理结构上呢?
取决于栈的物理结构
在这里插入图片描述

再来看链表实现

在这里插入图片描述

**数组和链表的更优的方法时间复杂度都为O(1),到底是使用哪一个呢?
我们再来看所占字节大小

在这里插入图片描述

栈的底层结构是数组物理上是连续的

注意:不是说栈只能用数组来实现,也能够使用链表来实现

1.3栈的实现

结构定义
typedef int STDataType;
typedef struct Stack {STDataType* arr;int capacity;//容量int top;//指向栈顶的位置
}ST;

与单链表类似。

判空

在这里插入图片描述

分清栈为空,栈中的存储元素的地址为空,此处是判定后者的
栈为空,比如ps=NULL,后者是ps结构体中的成员为空

入栈

在这里插入图片描述

细节
1:存储空间不够,是对应存储数据的空间不够,realloc返回类型不要写成ST,不是开辟一个新的栈。
2:注意传过来的参数是不是NULL。

出栈

在这里插入图片描述

断言也可以写为assert(ps&&!STEmpty(ps));

取栈顶元素

在这里插入图片描述

获取栈中有效数据个数

在这里插入图片描述

弄清楚top与存储数据个数的关系

二:队列

2.1概念与结构

概念:只允许在⼀端进⾏插⼊数据操作,在另⼀端进⾏删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)。
⼊队列进⾏插⼊操作的⼀端称为队尾
出队列进⾏删除操作的⼀端称为队头
在这里插入图片描述

2.2底层逻辑

队列是线性表,在逻辑上是线性的,那物理结构上呢?他的底层逻辑是什么呢?我们来讨论一下。
在这里插入图片描述
在这里插入图片描述

两种思路时间复杂度都为O(n),且无法有较好的方法解决

接下来我们来看链表实现。
在这里插入图片描述

链表实现时时间复杂度也是O(n),那又该选谁呢?
时间复杂度为O(n)的原因是尾结点的位置遍历寻找,那我们就存储尾结点的位置即可,时间复杂度就会变为O(n)。

队列在物理结构上是不一定连续的

不是说队列只能用链表实现,数组实现也可以。

2.3 队列的实现

结构定义

在这里插入图片描述

初始化

在这里插入图片描述

接下来都是传址需要形参改变实参

入队

在这里插入图片描述

细节
1:开辟空间时开辟的是结点,而非队列,注意看数据类型,分清与栈开辟的区别
2:注意开辟是否成功。
3:大多数要注意空链表与非空链表的处理

判空

在这里插入图片描述

细节:传过来的pq队列可能为空,队列结点中可能为空,这里是在判断后者

出队

在这里插入图片描述

空链表和非空链表的处理。

取数据

在这里插入图片描述

有效数据个数

在这里插入图片描述

三:结语

欢迎大家阅读我的博客,感谢大家支持!!出错之处欢迎大家指出。

千磨万击还坚韧,任尔东西南北风,加油!!陌生人!!
在这里插入图片描述


http://www.ppmy.cn/devtools/151996.html

相关文章

计算机网络 (43)万维网WWW

前言 万维网(World Wide Web,WWW)是Internet上集文本、声音、动画、视频等多种媒体信息于一身的信息服务系统。 一、基本概念与组成 定义:万维网是一个分布式、联机式的信息存储空间,通过超文本链接的方式将分散的信息…

JVM相关面试题

一、JVM是什么: Java Virtual Machine,Java的运行环境(java二进制字节码的运行环境);一次编写、到处运行;自动管理内存,提供垃圾回收机制 JVM的组成部分、运行流程: 二、JVM的组成: 1.程序计数器: 程序计数器是线程私有的,内部…

AudioGPT全新的 音频内容理解与生成系统

AudioGPT全新的 音频内容理解与生成系统 ChatGPT、GPT-4等大型语言模型 (LLM) 在语言理解、生成、交互和推理方面表现出的非凡能力,引起了学界和业界的极大关注,也让人们看到了LLM在构建通用人工智能 (AGI) 系统方面的潜力。 现有的GPT模型具有极高的语言生成能力,是目前最…

【Web】2025西湖论剑·中国杭州网络安全安全技能大赛题解(全)

目录 Rank-l Rank-U sqli or not Rank-l username存在报错回显,发现可以打SSTI 本地起一个服务,折半查找fuzz黑名单,不断扔给fenjing去迭代改payload from flask import Flask, request, render_template_stringapp Flask(__name__)app…

Linux 音视频入门到实战专栏(视频篇)视频编解码 MPP

文章目录 一、MPP 介绍二、获取和编译RKMPP库三、视频解码四、视频编码 沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍如何调用alsa api来进行音频数据的播放和录制。 一、MPP 介绍 瑞芯微提供的媒体处理软件平台…

Python 调整 Excel 中的行列顺序

调整Excel 行列顺序指的是改变工作表中行或列的位置,以便更好地展示和分析数据。例如,你可以将重要数据列放在最前面,或者将相关数据列放在一起,以便更方便地进行比较和分析。本文将介绍如何通过Python高效地调整Excel 行列顺序。…

leetcode707-设计链表

leetcode 707 思路 本题也是用了虚拟头节点来进行解答,这样的好处是,不管是头节点还是中间的节点都可以当成是中间节点来处理,用同一套方法就可以进行处理,而不用考虑太多的边界条件。 下面题目中最主要的实现就是添加操作addA…

AI 编程工具—Cursor AI 对话模式详解 内嵌对话模式

AI 编程工具—Cursor AI 对话模式详解 内嵌对话模式 前面我们已经学习了Cursor 的两种工作模式,也就是Chat、Composer 更多细节可以看之前的文章 Cursor 对话模式详解 Chat、Composer 与 Normal/Agent 模式 这一节我们按一下最后一种模式,也就是内嵌对话模式 内嵌对话模式…