Skip to content
c
#define TRUE   1
#define FALSE  0
#define OK     1
#define ERROR  0
#define IBFEASIBLE  -1
#define OVERFLOW    -2  
typedef  int   Status;

#define  nullE  '#'      
typedef  char  ElemType;

typedef struct {
   ElemType  *base;      
   ElemType  *top;       
   int        size;      
} *SqStack;   

SqStack InitStack(int size) {   
   SqStack S;
   if (!(S = (SqStack)malloc(sizeof(*S)))) exit(OVERFLOW);   
   if (!(S->base = (ElemType*)calloc(size, sizeof(ElemType)))) exit(OVERFLOW);
   S->top = S->base;   S->size = size;
   return S;   
}

SqStack FreeStack(SqStack S) {
   if (S) { free(S->base);   free(S); }  return NULL;
}

void ClearStack(SqStack S) {
   if (S) S->top = S->base;
}

ElemType GetTop(SqStack S) {   
   if (!S || S->top == S->base) return nullE; 
   return *(S->top-1);                        
}

Status Push(SqStack S, ElemType e) {  
   if (!S) return ERROR;               
   if (S->top - S->base >= S->size) {  
      S->base = (ElemType*)realloc(S->base,    
                    S->size * 2 * sizeof(ElemType));
      if (!S->base) exit(OVERFLOW);   
      S->top = S->base + S->size;     
      S->size *= 2;                   
   }
   *S->top++ = e;  
   return OK;
}

ElemType Pop(SqStack S) {  
   
   if (!S || S->top == S->base) return nullE; 
   return *--S->top;  
}

Status StackEmpty(SqStack S) { 
   if (S->top == S->base) return TRUE;
   else return FALSE;
}

持之苟有恒,久久自芬芳