#include <stdio.h>
#include <stdlib.h>
#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;
Status InitStack(SqStack *S)
{
S->base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if(!S->base)
{
printf("内存分配失败!\n");
exit(OVERFLOW);
}
S->top = S->base;
S->stacksize = STACKINCREMENT;
return OK;
}
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 >= STACK_INIT_SIZE)
{
S->base = (SElemType *)realloc(S->base, (S->stacksize + STACKINCREMENT) * sizeof(SElemType));
if(!S->base)
{
printf("内存分配失败!\n");
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 visit(SElemType e)
{
printf("%d ", e);
return OK;
}
Status StackEmpty(SqStack S)
{
return S.top == S.base;
}
Status StackTravese(SqStack S, Status(visit)(SElemType))
{
while(S.top > S.base)
{
visit(*S.base ++);
}
printf("\n");
return OK;
}
Status StackDestroy(SqStack *S)
{
free(S->base);
S->base = NULL;
S->top = NULL;
S->stacksize = 0;
return OK;
}
void ClearStack(SqStack *S)
{
S->top = S->base;
}
int main()
{
int i;
SqStack S;
SElemType e;
if(InitStack(&S))
{
for(i = 0; i < 10; i++)
Push(&S, i);
printf("栈中元素依次为 :");
StackTravese(S, visit);
Push(&S, 90);
printf("插入元素后,栈中元素依次为 :");
StackTravese(S, visit);
GetTop(&S, &e);
printf("栈顶元素为:%d\n", e);
}
ClearStack(&S);
printf("清空后,栈空否:%d(1:空 0: 否)\n", StackEmpty(S));
StackDestroy(&S);
printf("销毁栈后, S.top = %u, S.base = %u, S.stacksize = %d\n", S.top, S.base, S.stacksize );
return 0;
}