来源:互联网 发布:windows 10 蓝屏重启 编辑:程序博客网 时间:2024/05/20 20:03

栈的抽象数据类型

ADT Stack{    数据对象:D={ai|ai属于ElemSet,i=1.2...,n,n>=0}    数据关系:R1={<a(i-1),ai>|a(i-1),ai属于D,i=2,...,n}             约定an端为栈顶,a1端为栈顶。    基本操作:           InitStack(&S)           操作结果:构造一个空栈S。           DestroyStack(&S)           初始条件:栈S已存在。           操作结果:栈S被销毁。           ClearStack(&S)           初始条件:栈S已存在。           操作结果:将S清为空栈。           StackEmpty(S)           初始条件:栈S已存在。           操作结果:若栈S为空栈,则返回TRUE,否则FALSE。           StackLength(S)           初始条件:栈S已存在。           操作结果:返回S的元素个数,即栈的长度。           GetTop(S,&e)           初始条件:栈S已存在且非空。           操作结果:用e返回S的栈顶元素。           Push(&S,e)           初始条件:栈S已存在。           操作结果:插入元素e为新的栈顶元素,并用e为新的栈顶元素。           Pop(&S,&e)           初始条件:栈S已存在。           操作结果:删除S的栈顶元素,并用e返回其值。           StackTraverse(S,visit())           初始条件:栈S已存在且非空。           操作结果:从栈底到栈顶依次对S的每个数据元素调用函数visit()。一旦visit()失败,则操作失败。}ADT Stack## 栈的表示和实现 ##   typedef struct{  SElemType *base;  SElemType *top;  int stacksize;   //栈的当前可使用的最大容量  }SqStack;   //===ADT  Stack的表示与实现====        //----栈的顺序存储表示-----  #define STACK_INIT_SIZE  100;  //存贮空间初始分配量  #define STACKINCREMENT    10;  //存储空间分配增量  typedef struct{      SElemType  *base;   //在栈构造之前和摧毁之后,base的值为NULL      SElemType   *top;     //栈顶指针      int stacksize;  //当前已分配的存储容量,以元素为单位 }SqStack; //---基本操作的函数原型说明------ Status InitStack(SqStack &S); //构造一个空栈S Status DestroyStack(SqStack &S);//销毁栈S,S不再存在 Status ClearStack(SqStack &S); //把S置为空栈 Status StackEmpty(SqStack S); //若栈为空栈,则返回TREE,否则返回FALSE int StackLength(SqStack S); //返回S的元素个数,即栈的长度 Status GetTop(SqStack S,SElemType &e); //若栈不空,则用e返回S的栈顶元素,并返回OK,否则返回ERROR Status Push(SqStack &S,SElemType e); //插入元素e为新的栈顶元素 Status Pop(SqStack &S,SElemType &e); //若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK,否则返回ERROR Status StackTraverse(SqStack S,Status(*visit)()); //从栈底到栈顶依次对栈中每个元素调用函数visit().一旦visit()失败,则操作失败    //---基本操作的算法描述(部分)-----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;}//InitStackStatus GetTop(SqStack S,SElemType &e){ //若栈不空,则用e返回S的栈顶元素,并返回OK,否则返回ERROR     if(S.top==S.base) return ERROR;       e=*(S.top-1);       return OK;}//GetTopStatus 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;}//PushStatus Pop(SqStack &S,SElemType &e){    //若栈不空,则删除S的栈顶元素,并用e返回其值,并返回OK,否则返回ERROR    if(S.top==S.base)return ERROR;    e=*--S.top;    return OK;}//Pop                            
0 0
原创粉丝点击