栈的基本结构和基本操作(c语言描述)

 

#include<stdio.h> /* EOF(=^Z或F6),NULL */

#include<stdlib.h> /* atoi() */

#include<string.h>

#include<malloc.h> /* malloc()等 */

#include<io.h> /* eof() */

#include<process.h> /* exit() */

 

 /* 函数结果状态代码 */

 #define TRUE 1

 #define FALSE 0

 #define OK 1

 #define ERROR 0

 #define INFEASIBLE -1

 #define OVERFLOW -2

 

 typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */

 typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */

 typedef int SElemType; // 定义栈元素类型

 

 

//栈的顺序存储表示

#define STACK_INIT_SIZE 12    //存储空间初始分配量

#define STACKINCREMENT 2    //存储空间分配增量

 

typedef struct{

       SElemType *base;//栈底指针,在构造之前和销毁之后,base为NULL

       SElemType *top;//栈顶指针

       int stacksize;//当前已分配的栈空间,以元素为单位

}SqStack;

 

//-----栈的基本操作-------

Status InitStack(SqStack *S);//构造一个新的栈

Status DestoryStack(SqStack *S);//销毁栈S

Status ClearStack(SqStack *S);//把栈S置为空

Status StackEmpty(SqStack S);//判断S是否为空,若为空,返回TRUE,否则返回FALSE

int StackLength(SqStack S);//返回S的元素个数,及栈的长度

Status GetTop(SqStack S,SElemType *e);//若栈不为空,用e返回S的栈顶元素,并返回TRUE,否则返回FALSE

Status Push(SqStack *S,SElemType e);//插入元素e为新的栈顶元素

Status Pop(SqStack *S,SElemType *e);//若栈不为空,则删除栈顶元素,并用e返回其值,返回OK,否则返回ERROR

Status StackTraverse(SqStack S,Status(*visit)());//从栈顶到栈底依次对栈中每个元素调用函数visit(),一旦调用visit()失败,则操作失败

Status visit(SElemType c);

 

//-------基本操作的算法描述-----------

//----------构造一个新的栈

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;

}

       //-------销毁栈S,S不再存在

 Status DestroyStack(SqStack *S)

 {

   free((*S).base);

   (*S).base=NULL;

   (*S).top=NULL;

   (*S).stacksize=0;

   return OK;

 }

       //-------把S置为空栈

 Status ClearStack(SqStack *S)

 {

   (*S).top=(*S).base;

   return OK;

 }

 //----------若栈S为空栈,则返回TRUE,否则返回FALSE

 Status StackEmpty(SqStack S)

 {

   if(S.top == S.base)

     return TRUE;

   else

     return FALSE;

 }

  //---------返回S的元素个数,即栈的长度

 int StackLength(SqStack S)

 {

   return S.top-S.base;

 }

//--------若栈不为空,用e返回S的栈顶元素,并返回TRUE,否则返回FALSE

Status GetTop(SqStack S,SElemType *e)

{

       if(S.top==S.base)

              return ERROR;

       *e = *(S.top-1);

       return OK;

}

 

//---------插入元素e为新的栈顶元素

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;

}

//---------若栈不为空,则删除栈顶元素,并用e返回其值,返回OK,否则返回ERROR

Status Pop(SqStack *S,SElemType *e)

{

   if((*S).top==(*S).base)

     return ERROR;

   *e=*--(*S).top;

   return OK;

}

//---------从栈底到栈顶依次对栈中每个元素调用函数visit()

 Status StackTraverse(SqStack S,Status(*visit)(SElemType))

 {

   //一旦visit()失败,则操作失败

   while(S.top>S.base)

     visit(*S.base++);

   printf("\n");

   return OK;

 }

//------------栈中每个元素的访问函数---------

 Status visit(SElemType c)

 {

   printf("%d ",c);

   return OK;

 }

 

int main(void)

 {

       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);

       return 0;

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值