栈的特点:只能在一个端进行数据的插入和删除,一次只能向栈加入一个数字,一次也只能获得一个数字,先入栈的后出栈,后入栈的数据先出栈
FILO:fisrt in last out
LIFO: last in first out
实现栈的方式:
①用顺序表的思想实现栈的思想,也就是顺序栈
②用链表的思想实现栈的思想,也就是链式栈
1、顺序栈
继承顺序表的内存连续,长度固定的特点
逻辑结构:线性结构
存储结构:顺序存储
提供两种创建栈的思路
第一种,采用结构体来维护栈空间
栈的长度可以在创建时指定在函数形参中
栈针:标示最后一个元素的位置
第二种,采用结构体创建栈空间
代码简单,但需要一开始就用宏来指定要创建多大的栈空间
下面以第一种为例进行栈的代码实现,栈也是一种思想,代码实现不唯一
头文件如下,接下来用代码实现这些基本操作函数
这些就是函数的实现过程
下面写一个主函数测试一下
可以看到结果没什么问题,大体思路应该就是这样,第二种实现思路基本一致,只是第二种不需要间接的指向栈空间,直接在结构体中创建了栈空间,提前给定好总空间大小,那么结构体中只需要定义一个数组作为栈的存储空间,一个数字来记录有效元素的个数即可实现
2、链表栈
继承了链表的一些特性,长度不需要固定,内存空间动态分配,通过地址连接在一起
线性结构,链式存储的方式
链表永远不会满,那么用链表编写的栈也永远不会满,不需要判满函数
使用栈的思想,不论我们加入元素还是删除元素,亦或者是获得元素,只能从链表的尾部操作,也要实现先进后出的思想,我的理解其实就是一个受到一定束缚的链表
栈针:保存的是栈顶数据元素的地址
定义一个链表的结构体
typedef int datatype;
typedef struct node{
datatype data;
struct node_t *next;
}lstack_t;
先看下头文件,我们来实现头文件这些函数
函数的实现
写个测试函数进行测试代码
可以看出测试结果没有问题
代码实现不唯一,栈的思想一致即可