[cpp] view plaincopyprint?
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define ERROR -1
#define STACKINITSIZE 20
#define STACKADDSIZE 5
typedef int ElemType;
typedef int Status;
typedef struct
{
ElemType *top;
ElemType *base;
int stackSize;
} sqStack;
Status InitStack(sqStack *s);
Status PushStack(sqStack *s,ElemType e);
Status PopStack(sqStack *s,ElemType *e);
Status ClearStack(sqStack *s);
Status DestroyStack(sqStack *s);
int GetStackLen(sqStack *s);
void my_err(char *s);
int main(int argc,char *argv[])
{
sqStack s;
Status result;
result=InitStack(&s);
if(result==ERROR)
{
my_err("InitStack return Error.");
}
int i;
for(i=0;i<47;i++)
{
result=PushStack(&s,i);
if(result==ERROR)
{
my_err("PushStack return Error.");
}
}
ElemType e;
for(i=0;i<40;i++)
{
result=PopStack(&s,&e);
if(result==FALSE)
{
printf("The stack has no value.\n");
break;
}
if(result==TRUE)
{
printf("%d,",e);
}
}
printf("\nStack length:%d\n",GetStackLen(&s));
ClearStack(&s);
DestroyStack(&s);
exit(0);
}
//初始化棧
Status InitStack(sqStack *s)
{
s->base=(ElemType *)malloc(STACKINITSIZE*sizeof(ElemType));
if(!s->base)
return ERROR;
s->top=s->base;
s->stackSize=STACKINITSIZE;
return TRUE;
}
//入棧
Status PushStack(sqStack *s,ElemType e)
{
if(s->top-s->base>=s->stackSize)//當棧空間大小不足時,動態增長棧空間
{
s->base=(ElemType *)realloc(s->base,(STACKADDSIZE+s->stackSize)*sizeof(ElemType));
if(!s->base)
return ERROR;
s->top=s->base+s->stackSize;
s->stackSize+=STACKADDSIZE;
}
*(s->top)=e;
s->top++;
return TRUE;
}
//出棧
Status PopStack(sqStack *s,ElemType *e)
{
if(s->top==s->base)
return FALSE;
(*e)=*(--s->top);
return TRUE;
}
//銷燬棧
Status DestroyStack(sqStack *s)
{
free(s->base);
s->base=s->top=NULL;
s->stackSize=0;
return TRUE;
}
//清空棧
Status ClearStack(sqStack *s)
{
s->top=s->base;
return TRUE;
}
//獲取棧中已有數據的長度
int GetStackLen(sqStack *s)
{
return s->top-s->base; //注意:地址指針相減,結果並不是地址差,而是實際元素的差值。
}
void my_err(char *s)
{
perror(s);
exit(1);
}