数据结构——栈

数据结构——栈

一.预定义常量

#define TRUE    1 
#define FALSE 0
#define OK     1
#define ERROR 0
#define INFEASIBLE -1 
#define OVERFLOW -2 

二.栈的结构定义

 #define STACK_INIT_SIZE 100 //顺序栈存储空间的初始分配量
 #define STACKINCREMENT 10   //顺序栈存储空间的分配增量
 
 typedef int SElemType;
 typedef int Status;
 
 typedef struct
 {
    SElemType *base; //栈底指针,始终指示存储空间的基址
    SElemType *top; //栈顶指针,指向栈顶元素的下一个位置
    int stacksize;  //数组存储空间的长度
 }SqStack; 

三.栈的基本操作

/*
 InitStack (&s); //构造 
 StackEmpty(S);//判空 
 StackLength(&S);//求栈长 
 GetTop(S, &e);//取栈顶元素 
 Push(&S, e);//往栈顶放元素 
 Pop(&S, &e);//从栈顶取出一个元素 
 ClearStack(&S);//清空 
 StackTraverse(S, visit());//遍历 
 DestroyStack(&S);//销毁 
 */
 
 //构造一个空栈
 Status InitStack(SqStack &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 StackEmpty(SqStack S)
 {
  return S.top==S.base;
 }
 
 //求栈长 
 SElemType StackLength(SqStack S)
 {
  return S.top-S.base;
 }
 
 //取栈顶元素 
 Status GetTop(SqStack S, SElemType &e) 
 {
  if(S.top==S.base)  return ERROR;
  e=*(S.top-1);
   return OK;
 }
 
 //往栈顶插入元素 
 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)  
    exit(OVERFLOW);
   S.top=S.base+S.stacksize;
   S.stacksize+=STACKINCREMENT;
  } 
  *S.top++=e;
  return OK;
 }
 
 //从栈顶取出一个元素
 Status Pop(SqStack &S,SElemType &e)
 {
  if(S.top==S.base) 
         return ERROR;  
  e=*--S.top; 
  return OK;
 } 
  
 //遍历顺序栈
 Status StackTraverse(SqStack S,Status (*visit)(SElemType))
 {
     SElemType *p;
     for(p=S.base;p<S.top;p++) 
         {
    if(!visit(*p)) 
     return ERROR;
   } 
    return OK;
 }  
 //访问函数 
 Status print(SElemType e){
      printf("%d",e);
      return OK;
 }
 
  
 //清空顺序栈 
 Status ClearStack(SqStack &S)
 {
  S.top=S.base;             
  return OK;
 }
 
 //销毁栈 
 Status DestroyStack(SqStack &S)
 {
  if(S.base)  
   free(S.base);
  S.base=NULL;
  return OK;
 }
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值