暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

数据结构(严蔚敏C语言版)——栈(链栈)

编程Cookbook 2020-03-09
28

点击上方蓝字关注我!

如果有错误或者理解不到位的地方还请各位指正!

数据结构的相关问题,可以参考笔者写的系列数据结构文章,或者加我交流!

声明:以下内容是对清华大学出版社出版,由严蔚敏和吴伟民编著的图书《数据结构》(C语言版)的代码实现。
图书PDF版本可移步公众号【李歘歘】回复电子书领取。
《数据结构》(C语言版)是各大高校计算机有关专业的指定教材,还是计算机考研的统考专业课数据结构指定的参考书籍,数据结构作为408专业课的重中之重,值得大家重视。

上次说到了栈的顺序栈,今天我们来说一下有关栈之链栈,相关知识点可以先了解一下。


书中位置(页码):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

      运行结果:

      「往  •  期  •  精  •  选」

          

      程序员自学攻略——分享珍藏多年的学习网站

      在B站,我看到了不同的技术人生

      原谅我,是我不配!!!

      数据结构(严蔚敏C语言版)——栈(顺序栈)
      数据结构(严蔚敏C语言版)——线性表(静态链表)

      考研VS就业——选一条适合自己的路

      这些经典排序,你必须掌握
      最短路径——Dijkstra算法这一篇就够了

      全源最短路径问题——Floyd算法

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

      评论