`
```cpp
typedef int SElemType;
typedef struct {
SElemType* base;
SElemType* top;
int stacksize;
} SqStack;
Status InitStack(SqStack* S);
Status DestroyStack(SqStack* S);
Status ClearStack(SqStack* S);
Status StackEmpty(SqStack S);
int StackLength(SqStack S);
Status GetTop(SqStack S, SElemType* e);
Status Push(SqStack* S, SElemType e);
Status Pop(SqStack* S, SElemType* e);
Status StackTraverse(SqStack S, void(Visit)(SElemType));
Status InitStack(SqStack* S) {
if(S == NULL) {
return ERROR;
}
(*S).base = (SElemType*) malloc(STACK_INIT_SIZE * sizeof(SElemType));
if((*S).base == NULL) {
exit(OVERFLOW);
}
(*S).top = (*S).base;
(*S).stacksize = STACK_INIT_SIZE;
return OK;
}
Status DestroyStack(SqStack* S) {
if(S == NULL) {
return ERROR;
}
free((*S).base);
(*S).base = NULL;
(*S).top = NULL;
(*S).stacksize = 0;
return OK;
}
Status ClearStack(SqStack* S) {
if(S == NULL || (*S).base == NULL) {
return ERROR;
}
(*S).top = (*S).base;
return OK;
}
Status StackEmpty(SqStack S) {
if(S.top == S.base) {
return TRUE;
} else {
return FALSE;
}
}
int StackLength(SqStack S) {
if(S.base == NULL) {
return 0;
}
return (int) (S.top - S.base);
}
Status GetTop(SqStack S, SElemType* e) {
if(S.base == NULL || S.top == S.base) {
return 0;
}
*e = *(S.top - 1);
ret