• 栈的顺序存储表示


     /* c3-1.h 栈的顺序存储表示 */
     #define STACK_INIT_SIZE 10 /* 存储空间初始分配量 */
     #define STACKINCREMENT 2 /* 存储空间分配增量 */
     typedef struct SqStack
     {
       SElemType *base; /* 在栈构造之前和销毁之后,base的值为NULL */
       SElemType *top; /* 栈顶指针 */
       int stacksize; /* 当前已分配的存储空间,以元素为单位 */
     }SqStack; /* 顺序栈 */
     /* bo3-1.c 顺序栈(存储结构由c3-1.h定义)的基本操作(9个) */
     Status InitStack(SqStack *S)
     { /* 构造一个空栈S */
       (*S).base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
       if(!(*S).base)
         exit(OVERFLOW); /* 存储分配失败 */
       (*S).top=(*S).base;
       (*S).stacksize=STACK_INIT_SIZE;
       return OK;
     }
    
     Status DestroyStack(SqStack *S)
     { /* 销毁栈S,S不再存在 */
       free((*S).base);
       (*S).base=NULL;
       (*S).top=NULL;
       (*S).stacksize=0;
       return OK;
     }
    
     Status ClearStack(SqStack *S)
     { /* 把S置为空栈 */
       (*S).top=(*S).base;
       return OK;
     }
    
     Status StackEmpty(SqStack S)
     { /* 若栈S为空栈,则返回TRUE,否则返回FALSE */
       if(S.top==S.base)
         return TRUE;
       else
         return FALSE;
     }
    
     int StackLength(SqStack S)
     { /* 返回S的元素个数,即栈的长度 */
       return S.top-S.base;
     }
    
     Status GetTop(SqStack S,SElemType *e)
     { /* 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR */
       if(S.top>S.base)
       {
         *e=*(S.top-1);
         return OK;
       }
       else
         return ERROR;
     }
    
     Status Push(SqStack *S,SElemType e)
     { /* 插入元素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;
         (*S).stacksize+=STACKINCREMENT;
       }
       *((*S).top)++=e;
       return OK;
     }
    
     Status Pop(SqStack *S,SElemType *e)
     { /* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */
       if((*S).top==(*S).base)
         return ERROR;
       *e=*--(*S).top;
       return OK;
     }
    
     Status StackTraverse(SqStack S,Status(*visit)(SElemType))
     { /* 从栈底到栈顶依次对栈中每个元素调用函数visit()。 */
       /* 一旦visit()失败,则操作失败 */
       while(S.top>S.base)
         visit(*S.base++);
       printf("\n");
       return OK;
     }
     /* main3-1.c 检验bo3-1.cpp的主程序 */
     #include"c1.h"
     typedef int SElemType; /* 定义栈元素类型,此句要在c3-1.h的前面 */
     #include"c3-1.h"
     #include"bo3-1.c"
    
     Status visit(SElemType c)
     {
       printf("%d ",c);
       return OK;
     }
    
     void main()
     {
       int j;
       SqStack s;
       SElemType e;
       if(InitStack(&s)==OK)
         for(j=1;j<=12;j++)
           Push(&s,j);
       printf("栈中元素依次为:");
       StackTraverse(s,visit);
       Pop(&s,&e);
       printf("弹出的栈顶元素 e=%d\n",e);
       printf("栈空否:%d(1:空 0:否)\n",StackEmpty(s));
       GetTop(s,&e);
       printf("栈顶元素 e=%d 栈的长度为%d\n",e,StackLength(s));
       ClearStack(&s);
       printf("清空栈后,栈空否:%d(1:空 0:否)\n",StackEmpty(s));
       DestroyStack(&s);
       printf("销毁栈后,s.top=%u s.base=%u s.stacksize=%d\n",s.top,s.base, s.stacksize);
     }
    作者:cpoint
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    Spider爬虫清洗数据(re方法)
    Python 操作 mongodb 数据库
    python操作mysql数据库
    BeautifulSoup高级应用 之 CSS selectors /CSS 选择器
    mongoDB在centos7上的安装
    CentOS7安装mongoDB数据库
    [洛谷P4602] CTSC2018 混合果汁
    [洛谷P2605] ZJOI2016 基站选址
    [CF1039D] You Are Given a Tree
    [CF1105E] Helping Hiaset
  • 原文地址:https://www.cnblogs.com/cpoint/p/3479521.html
Copyright © 2020-2023  润新知