自学嵌入式第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.销毁

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

相关推荐
星轨初途2 小时前
LeetCode 热题 100——day11 滑动窗口最大值
数据结构·c++·算法·leetcode·职场和发展
LuminousCPP15 小时前
数据结构-双向循环链表
c语言·数据结构·笔记·链表
白狐_79816 小时前
408数据结构第5章:树与二叉树②——遍历、线索树、森林与哈夫曼
数据结构·算法·深度优先
Jasmine_llq18 小时前
《P15800 [GESP202603 六级] 选数》
数据结构·long long·逆序线性 dp·从后往前推导·转移严格遵循题意·防止总和溢出·复杂度on
疯狂打码的少年18 小时前
【数据结构】串(字符串):基本概念与存储
数据结构·笔记
纵有疾風起19 小时前
线性表的定义与基本操作 — 从逻辑结构到 ADT 接口
数据结构·算法·408·线性表·adt
wuyk55520 小时前
1.栈:后进先出的线性数据结构
c语言·数据结构·stm32·单片机
LuminousCPP21 小时前
数据结构-时间与复杂度|时间/空间复杂度 + 两道力扣练习 + 二分查找复盘
c语言·数据结构·经验分享·算法·leetcode
Nil20821 小时前
leetcode 三数之和
数据结构·算法·leetcode