文章目录
- 前言
- 一、栈(Stack)的基本量建立
- 二、栈的基本操作
- 2.1栈的初始化(STInit)
- 2.2入栈(STPush)
- 2.25判断是否为空(STEmpty)
- 2.3获取栈顶元素(STTop)
- 2.4出栈(STPop)
- 2.5栈的大小(STSize)
- 2.6栈的销毁(STDestroy)
- 总结
前言
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据也在栈顶。
一、栈(Stack)的基本量建立
typedef int STDataType;//栈的数据类型typedef struct stack {STDataType* a;//栈存放的位置int top;//用来标记栈顶int capacity;//栈的容量}ST;//把基本量封装成一个结构体
二、栈的基本操作
2.1栈的初始化(STInit)
void STInit(ST* ps) {assert(ps);//栈可以为空,但是存放栈相关基本量的结构体不能为空ps->a = (STDataType*)malloc(sizeof(STDataType) * 4);//初始栈的大小为4if (NULL == ps->a) {perror("Init error");return;}//判断是否为有效空间ps->top = 0;//top从0开始,//top在目前栈顶元素的下一个位置,没存放数据ps->capacity = 4;//初始容量}
2.2入栈(STPush)
void STPush(ST* ps,STDataType x) {assert(ps);if (ps->capacity == ps->top) {STDataType* tmp = (STDataType*)realloc(ps->a,sizeof(STDataType) * ps->capacity * 2);//判断当前容量是否支持入栈,不够则进行扩容if (tmp == NULL) {perror("STPush error");return;}ps->a = tmp;//a指向新开辟的空间ps->capacity *= 2;//新空间容量为原来二倍}ps->a[ps->top] = x;//在当前top指向插入xps->top++;//top后移一个位置}
2.25判断是否为空(STEmpty)
bool STEmpty(ST* ps) {assert(ps);return ps->top == 0;//因为top指向最后一个数据的后一个位置,所以top//为0,说明前面没有元素}
2.3获取栈顶元素(STTop)
STDataType STTop(ST* ps) {assert(ps);assert(!STEmpty(ps));//判断是否为空,为空则不能读取栈顶元素return ps->a[ps->top - 1];//因为top指向最后一个数据的后一个位置,//top下标的位置为空,所以要向前一位}
2.4出栈(STPop)
void STPop(ST* ps) {assert(ps);assert(!STEmpty(ps));//判断是否为空,为空则不能出栈ps->top--;//这里出栈并不是真正意义上的销毁数据,//而是让top前移一个位置//而我们不会访问top下标及其以后的位置,所以//达到了类似消除的效果//当top为0就代表出栈了全部数据}
2.5栈的大小(STSize)
int STSize(ST* ps) {assert(ps);return ps->top ;//数组是从0开始的,而top的位置在最后一个数据//后一个位置,所以top就是栈中数据数量}
2.6栈的销毁(STDestroy)
void STDestroy(ST* ps){assert(ps);free(ps->a);//释放空间ps->a = NULL;//别忘了置空ps->top = 0;ps->capacity = 0;}
总结
栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。