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

文章目录

欢迎大家来到我的博客,给生活加点impetus!!!

今天我们学习栈和队列

栈和队列

一:栈

1.1概念与结构

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

理解后进先出法则。

1要出来的话必须先让2和3出来,2要出来的话必须先让3出来。

先进后出 或者后进先出

1.2底层逻辑

在前面我们已经介绍了线性表。

栈在逻辑结构上一定是连续的,那物理结构上呢?

取决于栈的物理结构

再来看链表实现

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

栈的底层结构是数组,物理上是连续的
注意:不是说栈只能用数组来实现,也能够使用链表来实现

1.3栈的实现

结构定义
c 复制代码
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队列可能为空,队列结点中可能为空,这里是在判断后者。

出队

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

取数据
有效数据个数

三:结语

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

千磨万击还坚韧,任尔东西南北风,加油!!陌生人!!

相关推荐
zander2585 小时前
4. 寻找两个正序数组的中位数:用分割点代替合并
数据结构·算法
敲上瘾6 小时前
redis常用数据类型与操作方法
数据结构·数据库·redis·缓存
牢姐与蒯6 小时前
c++高级数据结构之图(基本概念,存储结构,BFS,DFS,最小生成树)
数据结构·c++·
Tongzhi20267 小时前
考勤数据本地化存储:通芝科技无感考勤一体机的数据安全逻辑
大数据·数据结构·科技·均值算法·数据库开发·推荐算法
她说可以呀7 小时前
Spring-ai-Rag-多文件格式生成 List<Document>
数据结构·list
郝学胜_神的一滴9 小时前
干货版《算法导论》17:双数极值配对与卡牌手牌编码最优解
数据结构·算法
我不会插花弄玉10 小时前
10.list【由浅入深-C++】
数据结构·c++·list
星轨初途10 小时前
LeetCode 热题 100——day6 三数之和
数据结构·c++·算法·leetcode·职场和发展
wabs66620 小时前
关于图论【卡码网117.软件构建的思考】
数据结构·算法·软件构建·图论·卡码网
Tongzhi202621 小时前
从部署到运维:通芝科技无感考勤一体机的全流程效率解析
运维·数据结构·科技·算法·贪心算法