#include <iostream>
#include <cstdio>
#include <malloc.h>
using namespace std;
#define STACK_INIT_SIZE 10
#define STACK_INCREMENT 2
#define OVERFLOW 0
#define TRUE 1
#define FALSE 0
#define ERROR 0
#define OK 1
typedef int Status;
typedef int SElemType;
struct SqStack
{
SElemType *base; // ,base=NULL
SElemType *top; //
int stacksize; //
};
//S.top= ,*S.top=
void InitStack(SqStack &S);
void DestroyStack(SqStack &S);
void ClearStack(SqStack &S);
Status StackEmpty(SqStack &S);
int StackLength(SqStack S);
Status GetTop(SqStack S,SElemType &e);// , e , OK
void Push(SqStack &S,SElemType e); // e ,
Status Pop(SqStack &S,SElemType &e); // S , S , e , OK
void StackTraverse(SqStack S);
void 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; //
}
void DestroyStack(SqStack &S)
{
free(S.base); //
S.top=S.base=NULL; // ,
S.stacksize=0; //
}
void ClearStack(SqStack &S)
{
S.top=S.base;
}
Status StackEmpty(SqStack &S)
{
if(S.top==S.base) //
return TRUE;
else
return FALSE;
}
int StackLength(SqStack S)
{
return S.top-S.base;
}
Status GetTop(SqStack S,SElemType &e)// , e , OK
{
if(S.top>S.base)
{
e=*(S.top-1); // e
return OK;
}
else
return ERROR;
}
void Push(SqStack &S,SElemType e) // e ,
{
if(S.top-S.base==S.stacksize)//
{
S.base=(SElemType *)realloc(S.base,(S.stacksize+STACK_INCREMENT)*sizeof(SElemType));
if(!S.base) //
{
exit(OVERFLOW);
}
S.top=S.base+S.stacksize;
S.stacksize+=STACK_INCREMENT;
}
*(S.top)++=e; // e , ,
}
Status Pop(SqStack &S,SElemType &e) // S , S , e , OK
{
if(S.top==S.base)
return ERROR;
e=*--S.top;
return OK;
}
void StackTraverse(SqStack S)
{
SElemType *p=S.base;
while(S.top>p)
{
printf("%d ",*p++); //*p *S.base ,S.base
}
printf("
");
}
int main()
{
int j;
SqStack s;
SElemType e;
InitStack(s);
for(j=1;j<=12;j++)
Push(s,j); // j
printf(" :");
StackTraverse(s);
Pop(s,e);// , e
printf(" :%d
",e);
printf(" ?%d (1:Yes 0:No)
",StackEmpty(s));
GetTop(s,e); // e
printf(" %d, %d
",e,StackLength(s));
ClearStack(s);//
printf(" ?%d(1:Yes 0:NO)
",StackEmpty(s));
DestroyStack(s);
printf(" ?%d(1:Yes 0:NO)
",StackEmpty(s));
return 0;
}// S.base S.top *S.base *S.top