#if !defined(SQSTACK_H) #define SQSTACK_H const int STACKINCREMENT = 10; template<class T> class SqStack { private: T *base; T *top; int stacksize; public: SqStack(int MaxSize = 10); ~SqStack(); bool SqStackEmpty(); int SqStackLength(); bool GetTop(T &x); SqStack<T>& ClearStack(); SqStack<T>& Push(T e); SqStack<T>& Pop(T &x); void OutPut(); }; template<class T> SqStack<T>::SqStack(int MaxSize = 10) { stacksize = MaxSize; base = new T[stacksize]; top = base; } template<class T> SqStack<T>::~SqStack() { delete [] base; base = top = 0; stacksize = 0; } template<class T> bool SqStack<T>::SqStackEmpty() { return base == top; } template<class T> int SqStack<T>::SqStackLength() { return top - base; } template<class T> bool SqStack<T>::GetTop(T &x) { if (base == top) return false; x = *(top-1); return true; } template<class T> SqStack<T>& SqStack<T>::ClearStack() { top = base; return *this; } template<class T> SqStack<T>& SqStack<T>::Push(T e) { if (top - base >= stacksize) { int templen = stacksize; T *temp = new T[stacksize + STACKINCREMENT]; while (templen--) *temp++ = *base++; top = temp; base = top - stacksize; stacksize += STACKINCREMENT; } *top++ = e; return *this; } template<class T> SqStack<T>& SqStack<T>::Pop(T &x) { assert(top > base); x = *--top; return *this; } template<class T> void SqStack<T>::OutPut() { T *temp = base; while (temp < top) { std::cout << *temp++ << " "; } std::cout << std::endl; } #endif