栈的抽象数据类型

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;
}//InitStack
Status GetTop(SqStack S,SElemType &e){
 //若栈不空,则用e返回S的栈顶元素,并返回OK,否则返回ERROR
     if(S.top==S.base) return ERROR;
       e=*(S.top-1);
       return OK;
}//GetTop
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;
}//Push
Status Pop(SqStack &S,SElemType &e){
    //若栈不空,则删除S的栈顶元素,并用e返回其值,并返回OK,否则返回ERROR
    if(S.top==S.base)return ERROR;
    e=*--S.top;
    return OK;
}//Pop                            
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值