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

ops/2025/1/18 5:54:44/

文章目录

  • 栈和队列
    • 一:栈
      • 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/ops/151010.html

相关文章

react native学习【6.1】——列表视图

react native学习【6.1】——列表视图 官方文档官方文档链接具体内容FlatList & SectionList 具体操作1)移动文件2)修改_layout.tsx文件删除导入语句添加导入语句修改并添加具体的代码语句对报错语句进行修改最终的_layout.tsx文件的代码 3&#xf…

网络安全 | 防护技术与策略

网络安全 | 防护技术与策略 一、前言二、网络安全防护技术2.1 防火墙技术2.2 加密技术2.3 入侵检测与防范系统(IDS/IPS)2.4 身份认证技术 三、网络安全策略3.1 网络访问控制策略3.2 数据安全策略3.3 应急响应策略 四、网络安全防护技术与策略的整合与优化…

IM聊天学习资源

文章目录 参考链接使用前端界面简单效果消息窗口平滑滚动至底部vue使用watch监听vuex中的变量变化 websocket握手认证ChatKeyCheckHandlerNettyChatServerNettyChatInitializer 参考链接 zzhua/netty-chat-web - 包括前后端 vue.js实现带表情评论功能前后端实现(仿…

数据库管理-第285期 Oracle 23ai:深入浅出向量索引(20250117)

数据库管理285期 20245-01-17 数据库管理-第285期 Oracle 23ai:深入浅出向量索引(20250117)1 HNSW事务支持解读 2 IVF分区支持解读 3 混合向量索引何时选择混合向量索引为何选择混合向量索引 总结 数据库管理-第285期 Oracle 23ai&#xff1a…

[云讷科技] 用于软件验证的仿真环境

我们使用Pursuit自动驾驶仪为各种场景设计仿真环境,以便用户可以在模拟环境中直接验证他们的软件,无需现场测试。该环境基于Gazebo引擎。 1. 工作区目录 模拟环境的工作区位于提供的U盘中的~/pursuit_space/sitl_space_pursuit中。用户可以按照用户手册…

校园跑腿小程序---任务界面 发布以及后端模板下载

hello hello~ ,这里是 code袁~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 🦁作者简介:一名喜欢分享和记录学习的在校大学生…

Ubuntu cuda-cudnn中断安装如何卸载

文章目录 问题描述解决方法使用强制移除 问题描述 Ubuntu22.04系统,在终端中执行apt insatll安装或dpkg .deb安装时如果强制关闭终端会导致安装失败(安装包会变成iu状态或ru状态,安装成功的应该是ii状态,只需要sudo apt remove p…

代码随想录算法训练营第三十天-贪心算法-763. 划分字母区间

标记字符最远位置,这是人能想到的?定义一个26个字母的数组,下标表示字母的位置,数组值表示当前字母在字符串中遍历过程中所处的位置算法题目无厘头太多,但解法也是太精彩,可是根本记不住,要每日…