小白莲的数据结构day06

mac2022-06-30  31

栈的创建、入栈、出栈操作(顺序结构)

各位大佬好,我是小白莲,今天小白莲给大家介绍的是栈的基本操作之创建、入栈、出栈操作。

首先说明一下,我用的是动态‘数组’,有些书本可能是直接调用数组,栈的最大容量就用个MAXSIZE来限定,动态数组的存储空间是可以灵活改变的,所以我采用的是动态‘数组’ 参考教材:《数据结构 C语言版》清华大学出版社 严蔚敏、吴伟民著

当然,如果觉得小白莲写得还不错,记得一定!一定!要点个赞再走哦!最好关注一下也是可以的,你们的对我的点赞和关注就是对我最大的支持,我真的很需要,谢谢!说的就是你,光收藏却不点赞,哼~~

1.定义栈的结构

//包含头文件 #include<stdio.h> #include<stdlib.h> //定义常量 #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define STACK_INIT_SIZE 100 //栈的存储空间初始分配量 #define STACKINCREMENT 10 //栈的存储空间分配增量 typedef int SElemType; typedef int Status; //定义栈的结构 typedef struct { SElemType* base; //基地址,在构造之前和销毁之后,base的值为NULL(base可看成栈底指针,一直在栈的最底端) SElemType* top; //栈顶指针 int stacksize; //当前已分配的存储空间,以元素为单位 }SqStack;

2.栈的初始化

//创建一个给栈初始化的函数 Status InitStack(SqStack &S) { //创建一个空栈S S.base = (SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType*)); //判断申请存储空间是否成功 if (!S.base) exit(OVERFLOW); //存储分配失败 //若申请存储成功则继续下一步 //top指针初始指向栈底 S.top = S.base; //给栈分配存储空间 S.stacksize = STACK_INIT_SIZE; return OK; }//InitStack

3.入栈操作

//入栈操作 Status Push(SqStack& S, SElemType e) { //先判断栈是否已满,若已满则给栈增加存储空间 //否则直接进行入栈操作 if (S.top - S.base >= S.stacksize) { S.base = (SElemType*)realloc(S.base,(S.stacksize + STACKINCREMENT) * sizeof(SElemType)); //判断申请存储空间是否成功 if (!S.base) exit(OVERFLOW); //给栈分配存储空间 //若成功则直接给栈追加空间 S.top = S.base; S.stacksize += STACKINCREMENT; } //把值放入栈顶 //这里其实可以把top当数组用S.top[0] = e; *S.top = e; //让栈顶指针top始终指向栈顶 S.top++; //注意:这里是让top指针的地址向‘栈上’移了一位,而不是值加了1 return OK; }//Push

4.出栈操作

注意:这里的出栈逻辑上把相应的元素‘删除’了(因为top指针往下移了一位),但存储空间还是有的,这个被‘删除’元素的存储空间在进栈时还可以被利用的,所以不用释放(当然也不能释放)

//出栈操作 //删除栈顶元素并用e返回其值 Status Pop(SqStack& S,SElemType &e) { //若栈不为空则删除栈顶元素并用e返回其值 //否则返回ERROR if (S.top == S.base) return ERROR; //先让top指针的地址向‘栈下’移一位,再取top指向的栈顶值赋给e //注意--S.top操作的是地址不是值! --S.top; e = *S.top; return OK; }//Pop

5.对初始化栈、入栈、出栈的测试

//测试 int main() { //创建一个栈stack SqStack stack; //调用InitStack函数给stack初始化 if (InitStack(stack)) { //若初始化成功,调用Push函数进行进栈操作 //用for循环给栈赋十个初始值 for (int i = 1; i <= 10; i++) { if (Push(stack, i)) continue; else ("入栈操作失败!\n"); } //调用Pop函数进行出栈操作 SElemType e; for (int i = 1; i <= 10; i++) { //若出栈成功则用e返回其值并输出 if (Pop(stack, e)) printf("%d ", e); else printf("出栈操作失败!\n"); } } else { printf("栈初始化失败!\n"); } return 0; }

5.1对初始化栈、入栈、出栈的测试结果

可以看到后进的元素先出来了(栈的‘后进先出’)

end

给人点赞,手留余香

预知后续操作如何,请看下集

@author 白莲居仙 QQ:1131977233

最新回复(0)