自学嵌入式第19天(数据结构篇——栈)

可以使用两种方式创建和使用。

栈的特点是先进后出,只能在栈顶操作数据,栈底不能进行操作。

一、顺序表

  1. .h文件

这里的这个结构体元素为指向顺序表(其实就是数组,为了方便理解我后面都叫数组)的指针;记录栈顶元素,栈的大小。

2.创建

首先要先创建这个结构体,并判断是否创建成功。然后这个结构体中的指针指向现在创建的这个数组,数组大小是可以改变的,由函数的实参决定,数组空间的大小就是数组类型的大小乘数组元素的个数。起始在创建完数组后也应该在这里判断是否创建成功,如果创建失败的话,我们也不能直接返回NULL,因为结构体已经创建成功了,所以如果需要返回就需要释放结构体的内存空间。然后栈顶为-1,表示此时栈无元素,最大值为n,但是这里要注意因为top是当做数组下标使用的,所以top最多只能到max-1。

3.入栈

入栈需要判断栈是否创建成功,和栈是否已经满了,这两种情况都不能继续入栈,如果没满,只需要将top向后移,然后以top为下标,填数据即可。pstacl->stack相当于是指向这个数组的指针,这里就是指针的写法。

4.出栈

出栈需要一个变量来记录一下出栈的元素,如果栈不为空,就让top现在指向的这个元素给data,然后top--。因为指针可以直接改变主调函数中变量的内容,所以这里的data用的指针。

5.获得栈顶元素

栈顶元素其实就是top现在指向的元素。

6.获得栈中元素个数

栈中的元素个数就是top+1,因为top是下标,下标是从0开始的,所以算个数时需要+1。

7.销毁

销毁就是直接释放数组的空间和这个结构体的空间。

二、链表

这里着重说一下两种方法的区别,我们知道在创建数组时要指定数组的大小,所以用数组构成的顺序表会有大小限制,并且因为数组的特性(单一性,有序性,连续性)所以我们可以直接用下标访问元素释放的时候也是可以直接释放整数组。而链表没有固定大小的要求,我们是在堆上给链表申请空间的,只要创建了新的节点,然后把他和之前的链表连在一起就没问题,释放的时候也需要一个节点一个节点的释放。

  1. .h文件

这里的结构体和单链表的结构体相同。

2.创建头节点

也就是创建一个单链表的头结点。

3.入栈

就是创建一个节点然后插进链表中,因为栈是先进后出,并且只能在栈顶操作,所以我们如果选择头插,在出栈时也要选择头删。这里入栈的操作和单链表相同。

4.获得栈顶元素

栈顶元素就是首节点。

5.出栈

出栈就是头删,和单链表的头删相同,只需要多一个变量保留出栈元素即可。

6.获得栈的大小

栈的大小就是单链表有效数据的长度。

7.销毁

销毁和单链表的销毁相同。

相关推荐
哭泣方源炼蛊4 小时前
并查集进阶 P1(带权并查集,并查集分类)
数据结构·c++·算法·二进制·带权并查集
五_谷_丰_登5 小时前
平衡二叉树(AVL)讲解二
数据结构·c++
fpcc7 小时前
数据结构和算法—最短路径的算法
数据结构·算法
Mr. zhihao8 小时前
从数组到 B+ 树:一棵树的进化史
数据结构·innodb·b+树
船厂电气自动化ai大模型8 小时前
AI大模型与数学第64课:矩阵×向量乘法(神经网络矩阵运算底层)
数据结构·深度学习·线性代数·机器学习·推荐算法
小欣加油9 小时前
Leetcode2058 找出临界点之间的最小和最大距离
数据结构·c++·算法·leetcode·职场和发展
CoderYanger9 小时前
A.每日一题:3345. 最小可整除数位乘积 I
java·数据结构·程序人生·算法·leetcode·面试·学习方法
带多刺的玫瑰9 小时前
Leecode#16刷题之最接近的三数之和
数据结构·算法
橘子汽水1689 小时前
Leetcode15:三数之和
java·数据结构·算法
Yfhonier10 小时前
6440. 极大连通图个数(DFS)
数据结构·算法·深度优先