#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