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

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

编程Cookbook 2020-03-07
43

点击上方蓝字关注我!

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

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

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

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


书中位置(页码):P44-P47

函数定义及说明:

    Status InitStack(SqStack &S)  //初始化栈
    Status Push(SqStack &S, SElemType e)  //入栈
    void Creat(SqStack &S,int n)  //创建栈,就是重复的将元素入栈(当然也可以单独写一个创建的函数)
    Status StackLength(SqStack S)  //获取元素个数
    bool StackEmpty(SqStack S)  //判断栈空
    Status GetTop(SqStack S,SElemType e)  //获取栈顶元素
    Status Pop(SqStack &S,SElemType e)  //出栈
    Status StackTraverse(SqStack S)  //遍历--从栈底到栈顶的元素输出
    Status ClearStack(SqStack &S)  //置空
    Status DestoryStack(SqStack &S)  //销毁

    程序代码:

      #include<cstdio>
      #include<cstdlib>
      #define SElemType int
      #define Status int
      #define STACK_INIT_SIZE 100 //初始空间分配量
      #define STACKINCREMENT 10 //存储空间分配增量

      using namespace std;
      //栈的结构
      typedef struct {
      SElemType *base; //栈底指针,在栈结构不存在(构造之前和销毁之后),base的值为NULL
      SElemType *top; //栈顶指针,非空栈的栈顶指针始终在栈顶元素的的下一个位置上
      int stacksize; //可存储的最大容量,即最多存储的元素个数
      }SqStack;

      //初始化栈
      /**
      说明,这里使用C语言的malloc和realloc
      除此之外,还可以使用c++的new运算符( S.base = new SElemType[MAXSIZE];)
      但是,new运算符在给定一个定长数组初始化后,长度变不能改变(c++没有realloc函数)
      改进有两个方法,
      (1)、在初始化时,使用vector变长数组代替数组
      (2)、新建一个更大的数组,将原有的元素复制过去(realloc就是这个原理)
      */
      Status InitStack(SqStack &S){
      S.base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
      if(!S.base){ //动态空间分配失败
      printf("动态空间分配失败\n");
      return 0;
      }
      S.top = S.base; //栈顶指针初值指向栈底,即top=base表示空栈
      S.stacksize = STACK_INIT_SIZE; //标记空间大小
      printf("初始化成功\n");
      return 0;
      }

      //入栈
      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){
      printf("动态空间分配失败\n");
      return 0;
      }
      S.top = S.base+S.stacksize; //更新栈顶元素指针
      S.stacksize += STACKINCREMENT; //更新最大容量
      }
      *S.top++ = e; //插入到栈顶并将栈顶指针加一
      printf("插入成功\n");
      return 0;
      }

      //创建栈,就是重复的将元素入栈(当然也可以单独写一个创建的函数)
      void Creat(SqStack &S,int n){
      InitStack(S);
      for(int i=0;i<n;i++){
      int e;
      scanf("%d",&e);
      Push(S,e);
      }
      printf("创建成功\n");
      }

      //获取元素个数
      Status StackLength(SqStack S){
      int count = S.top-S.base;
      return count;
      }
      //判断栈空
      bool StackEmpty(SqStack S){
      if(S.base == S.top){
      printf("栈为空\n");
      return true;
      }else{
      printf("栈不为空\n");
      return false;
      }
      }

      //获取栈顶元素
      Status GetTop(SqStack S,SElemType e){
      //若栈不为空
      if(!StackEmpty(S)){
      e = *(S.top-1);
      printf("栈顶元素值为:%d\n",e);
      }
      return 0;
      }

      //出栈
      Status Pop(SqStack &S,SElemType e){
      //判断栈空
      if(!StackEmpty(S)){
      e = *--S.top;
      printf("栈顶元素%d出栈成功\n",e);
      }
      return 0;
      }

      //遍历--从栈底到栈顶的元素输出
      Status StackTraverse(SqStack S){
      printf("遍历开始:\n");
      for(SElemType *i=S.base;i<S.top;i++){ //从底部开始,到栈顶的前一个停止
      printf("%d ",*i);
      }
      printf("\n");
      }

      //置空
      Status ClearStack(SqStack &S){
      S.top = S.base; //不能写成S.base = S.top; 位置不能反了
      printf("置空成功\n");
      return 0;
      }

      //销毁
      Status DestoryStack(SqStack &S){
      free(S.base); //销毁连续空间
      S.base = NULL; //底指针指针赋空
      S.top = NULL; //栈栈顶指针赋空
      S.stacksize = 0; //栈最大容量置为0
      printf("销毁成功");
      return 0;
      }

      int main(){
      int n,value1,value2;
      SqStack S;
      printf("请输入元素个数");
      scanf("%d",&n);
      Creat(S,n);
      printf("栈中元素的个数为%d\n",StackLength(S));
      Pop(S,value2);
      GetTop(S,value1);
      StackTraverse(S);
      ClearStack(S);
      StackEmpty(S);
      DestoryStack(S);
      return 0;
      }
      ————————————————
      版权声明:本文为CSDN博主「李歘歘」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
      原文链接:https://lichuachua.blog.csdn.net/article/details/104524813

      运行结果:


      「往  •  期  •  精  •  选」

          

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

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

      原谅我,是我不配!!!

      技术分享的优势——写文章半年的收获

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

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

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

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

      评论