本章介绍的主要内容是数据结构中栈的概念和栈的基本操作,包括:栈结构的定义、初始化、容量检查、判空、入栈、出栈、读取栈顶元素、读取栈内元素个数、栈的销毁等操作的具体实现。
栈的概念:
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈,出数据也在栈顶。
创建三个文件,手动实现一个栈:
栈的基本操作主要有:栈的初始化、判空、判满、取栈顶元素、在栈顶进行插入和删除,后下文将逐一实现。在栈顶插入元素称为入栈,在栈顶删除元素称为出栈。
栈的定义:
typedef int STDataType; typedef struct Stack { STDataType* data; //动态开辟数组 int top; //栈顶 int capacity; //容量 }ST;
栈的初始化:
从图上可以看出,空栈的栈顶指针的指向和栈底指针的指向一致,非空栈时栈中的栈顶指针始终在栈顶元素的下一个位置;
就是初始化成空栈,把 data
指针置为NULL
, top
和capacity
初始化为0
void StackInit(ST* ps)
{
assert(ps); //传进来的地址一定不能为空
ps->data = NULL;
ps->top = ps->capacity = 0;
}
栈的容量检查:
当我们使一个元素入栈的之前,我们往往需要判断一下栈是否为满栈,防止发生上溢的情况。
怎么判断容量满了呢? 答案:ps->top == ps->capacity
.
void StackCheckCapacity(ST* ps) { assert(ps); //ps不可为空 if(ps->top == ps->capacity) { //注意细节,如果此时容量为0,就给4个,否则就翻倍 int newcapacity = (ps->capacity == 0 ? 4 : 2 * ps->capacity ); STDataType* newnode = (STDataType*)realloc(ps->data,newcapacity*sizeof(STDataType)); if(newnode == NULL) { perror("fail"); exit(-1); } ps->data = newnode; //重新交接给ps->data ps->capacity = newcapacity;//更新容量 } }
栈的判空:
当我们弹出栈顶元素时,往往需要判断一下栈是否为空来防止发生下溢。
bool StackPush(ST* ps) { assert(ps); //ps不能为空 return ps->top == 0; //等于0就返回1, }
入栈:
入栈时我们首先要判断栈是否为满栈,如果为满栈我们要首先追加存储空间,然后才能将元素入栈。
void StackPush(ST* ps,STDataType val) { assert(ps); StackCheckCapacity(ps); //检查容量是否满了 ps->data[ps->top++] = val; }
出栈:
出栈时我们首先要判断栈是否为空栈,然后只需要ps->top
减去1就行。
void StackPop(ST* ps) { assert(ps); assert(!StackEmpty(ps)); ps->top--; }
读取栈顶元素:
直接把ps->top-1
的值返回
STDataType StackTop(ST* ps) { assert(ps); assert(!StackEmpty(ps)); return ps->data[ps->top - 1]; }
栈的元素个数:
直接把ps->top
的值返回
size_t StackSize(ST* ps) { assert(ps); return ps->top; }
栈的销毁:
void StackDestroy(ST* ps) { assert(ps); free(ps->data); //当ps->data是NULL时候,free什么都不会做 ps->data = NULL; ps->top = ps->capacity = 0; }
栈的打印:配合入栈和出栈、栈顶、栈的判空四个函数
int main() { ST p; StackInit(&p); while (!StackEmpty(&p)) { printf("%d ", StackTop(&p)); StackPop(&p); } return 0; }
数据结构的栈内容到此介绍结束了,感谢您的阅读!!!
如果内容对你有帮助的话,记得给我三连(点赞、收藏、关注)——做个手有余香的人。感谢大家的支持!!!