栈的定义与性质
第一个问题:什么是栈?
栈的定义是:
一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。
进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。
栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
分解一下就是:
首先是顺序表
只在一个端口进行数据插入和删除,这个端口叫做栈顶
另一个端口叫做栈底
元素的顺序遵循后进先出,先进后出的原则
第二个问题就是
什么是先进后出,什么是后进先出
就和手枪一样,在弹夹中,先压进去的子弹在弹夹的底部,后压入的子弹在弹夹的顶部,在顶部的子弹会先射出来
图解就是这样
这里是按照顺序入栈的方式,但是我们也可以不用顺序入栈,而是乱序入栈,结果就可能不一样
这个是栈的基本性质,针对这个基本性质,我们就能够实现栈
栈的实现
栈的定义
第一个问题,我们用顺序表还是链表实现?
栈的实现可以使用数组或者链表,但是相对而言数组的尾插是直接用最后一个下标插入就能够实现的,实现代价很小
所以我们使用数组
然后就是如何定义栈的问题
栈有如下特性,一块空间,栈顶部的位置,由于我们要动态使用栈,所以还要有栈空间的大小
struct Stack
{
StackData* a;
int top;
int cap;
};
栈的功能
栈有哪些功能?
栈的创建,栈的销毁,入栈,出栈,判断栈为空,统计栈元素个数,获得栈顶元素
栈的创建
栈的创建本质是数组的创建
定义数组默认大小为 4
对空间进行开辟
为何要传地址,因为我们修改的是函数外部的栈,要用地址修改
void StackInit(Stack* qs)
{
//暂时取4个字节大小
Stackdata* arr = (Stackdata*)malloc(sizeof(Stackdata)*