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

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

相关推荐
夜不会漫长10 小时前
C++:红黑树
数据结构·算法
冻柠檬飞冰走茶13 小时前
PTA刷题集之Airline Routes(C语言实现)
c语言·开发语言·数据结构·算法
736c13 小时前
固件开发岗算法
数据结构·算法
冻柠檬飞冰走茶13 小时前
PTA刷题集之Battle Over Cities - Hard Version(C语言实现)
c语言·开发语言·数据结构·算法
PaperAccept19 小时前
【研知有术论文发表】材料科学一区期刊,影响因子30+的纳米科技SCI,审稿严格但有效率
大数据·数据结构·科技·量子计算
Tairitsu_H19 小时前
[C++高阶数据结构·图论下] 最短路径:为什么“挑最小的”一定正确?
数据结构·c++·图论
Tairitsu_H20 小时前
[C++高阶数据结构·图论上] 最小生成树:为什么“选边”和“选点”是两条路?
数据结构·c++·图论·最小生成树
D e re k ZH1 天前
C++ 并发、未定义行为与工程化难点(No 3)
数据结构·c++·算法·面试
La Pulga2 天前
【FreeRTOS源码学习笔记】链表的实现
数据结构·笔记·stm32·mcu·链表·嵌入式·freertos
番茄味城市甜菜2 天前
数据结构:双向链表实现,链表与顺序表的对比
数据结构·链表