
点击上方蓝字关注我!
如果有错误或者理解不到位的地方还请各位指正!
数据结构的相关问题,可以参考笔者写的系列数据结构文章,或者加我交流!
声明:以下内容是对清华大学出版社出版,由严蔚敏和吴伟民编著的图书《数据结构》(C语言版)的代码实现。
图书PDF版本可移步公众号【李歘歘】回复电子书领取。
上次说到了栈的顺序栈,今天我们来说一下有关栈之链栈,相关知识点可以先了解一下。

书中位置(页码):P56
函数定义及说明:
Status InitStack(LStackList &S) //初始化Status Push(LStackList &S,SElemType e) //入栈Status Pop(LStackList &S) //出栈void Creat(LStackList &S,int n) //创建栈,就是重复的将元素入栈(当然也可以单独写一个创建的函数)Status StackTraverse(LStackList S) //遍历,因为是从栈顶(表头)开始的遍历,所以输出的列表是逆序的Status StackLength(LStackList S) //获取栈的元素个数bool StackEmpty(LStackList S) //判断栈空Status GetTop(LStackList S,SElemType e) //获取栈顶元素Status ClearStack(LStackList &S) //栈置空Status DestoryStack(LStackList &S) //销毁链表
程序代码:
#include<cstdio>#include<cstdlib>#define MAXSIZE 1000 //链表的最大长度#define SElemType int#define Status int//栈的结构typedef struct LStack{SElemType data; //数据域struct LStack *next; //指针域}LStack,*LStackList;//初始化Status InitStack(LStackList &S){S = new LStack;S->next = NULL;return 0;}//入栈Status Push(LStackList &S,SElemType e){LStackList p = new LStack; //生成新的结点p->data = e; //新结点的数据域赋值p->next = S; //新结点的指针域指向头结点(栈顶)S=p; //链表的表头更新为新插入的元素;printf("压入栈成功\n");return 0;}//出栈Status Pop(LStackList &S){if(S->next){LStackList p = S;S=S->next; //头指针后移free(p);printf("出栈成功\n");}else{printf("栈空\n");}}//创建栈,就是重复的将元素入栈(当然也可以单独写一个创建的函数)void Creat(LStackList &S,int n){InitStack(S);for(int i=0;i<n;i++){int e;scanf("%d",&e);Push(S,e);}printf("创建成功\n");}//遍历,因为是从栈顶(表头)开始的遍历,所以输出的列表是逆序的Status StackTraverse(LStackList S){printf("遍历开始:\n");LStackList p = S;/**注意:最后一个链表是没有元素的*/while(p->next){ //最后一个链表是没有元素的printf("%d ",p->data);p = p->next;}printf("\n");}//获取栈的元素个数Status StackLength(LStackList S){LStackList p = S;int count=0;while(p){p = p->next;count++;}printf("栈内元素个数为:%d\n",count);}//判断栈空bool StackEmpty(LStackList S){if(S->next == NULL){printf("栈空\n");return true;}else{printf("栈非空\n");return false;}}//获取栈顶元素Status GetTop(LStackList S,SElemType e){//判断栈空if(StackEmpty(S)){return 0;}else{e = S->data;printf("栈顶元素为%d\n",e);return 0;}}//栈置空Status ClearStack(LStackList &S){if(S->next != NULL)S->next = NULL;printf("置空操作成功\n");return 0;}//销毁链表Status DestoryStack(LStackList &S){//判断是否为空表LStackList p = S;LStackList pre = new LStack;while(p->next){pre = p;p = p->next;delete(pre);}printf("销毁链表成功\n");return 0;}int main(){int n,value1,value2;LStackList S;printf("请输入元素个数:");scanf("%d",&n);Creat(S,n);StackTraverse(S);StackLength(S);GetTop(S,value1);Pop(S);StackTraverse(S);GetTop(S,value1);ClearStack(S);StackTraverse(S);DestoryStack(S);return 0;}————————————————版权声明:本文为CSDN博主「李歘歘」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。原文链接:https://lichuachua.blog.csdn.net/article/details/104527610
运行结果:

「往 • 期 • 精 • 选」
数据结构(严蔚敏C语言版)——栈(顺序栈)
数据结构(严蔚敏C语言版)——线性表(静态链表)
这些经典排序,你必须掌握
最短路径——Dijkstra算法这一篇就够了


文章转载自编程Cookbook,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。





