数据结构之堆栈模拟应用(算法3.1)

#include <stdio.h>

#include <malloc.h>

#define STACK_INIT_SIZE         100

#define STACK_INCRASE_SIZE  20

 

enum State{ERR,OK,FAILED};

typedef int SElemType;

typedef struct tag_Stack              //此空递增

{

       SElemType*   pbase;                   //栈底指针

       SElemType*   ptop;                     //栈顶指针

       int                  stacksize;              //当前所有可用栈空间(包含已使用的)

}SqStack;

 

void InitStack(SqStack* ps)

{

       ps->pbase = (SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));   //分配失败处理略

       ps->ptop = ps->pbase;

       ps->stacksize = STACK_INIT_SIZE;

}

 

void push(SqStack* ps,SElemType* pdata)

{

       if(ps->ptop - ps->pbase >= ps->stacksize)   //判断是否栈溢出(允许范围)

       {

              ps->pbase = (SElemType*)realloc(ps->pbase,(ps->stacksize+STACK_INCRASE_SIZE)*sizeof(SElemType));

              //分配失败处理略

              ps->ptop = ps->stacksize + ps->pbase;

              ps->stacksize += STACK_INCRASE_SIZE;

       }

       *ps->ptop++ = *pdata;

}

 

enum State pop(SqStack* ps,SElemType* pdata) //出栈pdata

{

       if(ps->ptop == ps->pbase) return ERR;

       *pdata = *(ps->ptop-1);

       ps->ptop--;

       return OK;

}

 

int IsStackEmpty(SqStack* ps)

{

       if(ps->ptop == ps->pbase) return 1;

       return 0;

}

 

void main()

{

       SqStack Myps;                    //定义栈管理对象

       int num = 0,Ndiv8 = 0;  //待转化十进数

       SElemType Nmo8 = 0,popout = 0;

       InitStack(&Myps);

 

       while(1)

       {

              printf("请输入一个待转化为8进制的整数:");

              scanf("%d",&num);

              fflush(stdin);

              Ndiv8 = num;

              do

              {

                     Nmo8 = Ndiv8 % 8;

                     push(&Myps,&Nmo8);

                     Ndiv8 /= 8;

              } while(Ndiv8);

 

              //显示

              while(!IsStackEmpty(&Myps))

              {

                     pop(&Myps,&popout);

                     printf("%d",popout);

              }

              printf("\n");

       }

       return;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值