本节复习栈和队列中栈的增删查改。
首先回顾一下栈的性质: 栈的存储数据的原则是“后入先出”, 先入的在栈底, 后入的在栈顶。 弹出数据时在栈顶弹出。
开始实现栈的接口
栈的所有函数接口
//栈的初始化
void StackInit(Stack* pst);//入栈
void StackPush(Stack* pst, STDataType x);
//出栈
void StackPop(Stack* pst);
//获取栈顶元素
STDataType StackTop(Stack* pst);
//获取栈中有效元素的个数
int StackSize(Stack* pst);
//检测栈是否为空
bool StackEmpty(Stack* pst);
//销毁栈
void StackDestroy(Stack* pst);
-----------------------------------------------------------------------------------------------------------------------------------------
准备文件
先准备三个文件, 一个main.c, 一个.h文件用于声明函数接口, 还有一个.c文件用于实现函数接口
---------------------------------------------------------------------------------------------------------------------------------------
创建栈的结构体蓝图
首先包含一下头文件。重定义一下要保存的数据类型。 这样做是为了后续便于维护我们的栈。
然后再创建栈的结构体。 栈的结构体成员有三个, 一个指向动态开辟内存的指针(动态栈,更优)。第一个是栈的数据个数, 我们用top来表示。 第三个就是栈的总容量, 这个总容量不是固定的, 动态栈在后续空间不够还会开辟新的空间。
---------------------------------------------------------------------------------------------------------------------------------------
栈的初始化
创建好栈后第一步就是将栈进行初始化。
.h函数声明
.c函数实现
---------------------------------------------------------------------------------------------------------------------------------------
入栈
入栈时要确保栈有空间, 如果没有空间, 那么就需要开辟空间, 一般我们扩容的原则和顺序表示一样的。 就是扩容位原来的二倍大小的空间。
.h函数声明
.c函数实现
---------------------------------------------------------------------------------------------------------------------------------------
出栈
出栈要确保栈中有元素, 并且注意出栈元素应该为最后入栈的那个元素, 也就是data中下表为top - 1的元素。 出栈并不是要将top - 1处的元素拿走,而是让top 减去1, 对于栈来说, top 减去1, 就意味着少了一个元素。 这个元素就是栈顶的元素。
.h函数声明:
.c函数实现:
---------------------------------------------------------------------------------------------------------------------------------------
获取栈顶元素
栈顶元素就是top - 1位置的元素。
.h函数声明
.c函数实现
---------------------------------------------------------------------------------------------------------------------------------------
获取栈中有效元素的个数
栈的元素个数其实就是top的大小, 但是c语言推荐使用函数来获取栈的元素个数。
.h函数声明
.c函数实现
---------------------------------------------------------------------------------------------------------------------------------------
检测栈是否为空
top == 0的时候,栈就是空的。
这里忘记包含bool函数的头文件了。 包含一下头文件。
.h函数声明
.c函数实现
---------------------------------------------------------------------------------------------------------------------------------------
销毁栈
销毁栈的意思是销毁栈的data所指向的动态开辟的空间。 而不是销毁我们用结构体定义的栈的这个变量本身。 这个变量本身只是一个在栈帧空间开辟出来的结构体变量。 只有在堆区用动态开辟开辟出来的内存才需要销毁
.h函数声明
.c函数实现