#ifndef STACK_H
#define STACK_H
#include "stdlib.h"
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OK 1
#define OVERFLOW -2
#define Status bool
#define TRUE 1
#define FALSE 0
#define ERROR 0
template <typename SElemType>
class SqStack
{
public:
SElemType *base;
SElemType *top;
int stacksize;
Status InitStack();
Status DestroyStack();
Status ClearStack();
Status StackEmpty();
Status Push(SElemType e);
Status GetTop(SElemType &e);
Status Pop(SElemType &e);
int StackLength();
Status StackTraverse(Status (* visit)(SElemType e));
};
template <typename SElemType>
Status SqStack<SElemType>::InitStack()
{
base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if (!base) exit(OVERFLOW);
top = base;
stacksize = STACK_INIT_SIZE;
return OK;
}
template <typename SElemType>
Status SqStack<SElemType>::DestroyStack()
{
free (base);
base = top = NULL;
return OK;
}
template <typename SElemType>
Status SqStack<SElemType>::ClearStack()
{
top = base;
return OK;
}
template <typename SElemType>
Status SqStack<SElemType>::StackEmpty()
{
if (top == base)
{
return TRUE;
}
else
{
return FALSE;
}
}
template <typename SElemType>
Status SqStack<SElemType>::Pop(SElemType &e)
{
if (base == top) return ERROR;
e = *--top;
return OK;
}
template <typename SElemType>
Status SqStack<SElemType>::Push(SElemType e)
{
if (top - base >= stacksize)
{
base = (SElemType *)realloc(base,
(stacksize + STACKINCREMENT) * sizeof(SElemType));
if (!base) exit(OVERFLOW);
top = base + stacksize;
stacksize += STACKINCREMENT;
}
*top ++ = e;
return OK;
}
template <typename SElemType>
int SqStack<SElemType>::StackLength()
{
return top - base;
}
template <typename SElemType>
Status SqStack<SElemType>::GetTop(SElemType &e)
{
if (base == top) return ERROR;
e = *(top - 1);
return OK;
}
template <typename SElemType>
Status SqStack<SElemType>::StackTraverse(Status (* visit)(SElemType e))
{
if (base == top) return ERROR;
SElemType *pSElemType = top;
while (base < pSElemType)
{
pSElemType --;
visit(*pSElemType);
}
return OK;
}
#endif