这里的栈类模板是基于前面的动态数组的类模板实现的 #include "Array.cpp" template <class DataType> class CStack { public: CStack(); void push(DataType elementToPush); /* 从栈顶移除一个元素,并返回其值在elementToPush中 如果栈为空,返回FALSE,否则返回TRUE */ bool pop(DataType & poppedElement); /* 返回栈顶的元素,但不移除这个元素,如果栈为空 则返回FALSE,否则返回TRUE */ bool peek(DataType & topElement); /* 如果栈为空返回TRUE,否则返回FALSE */ bool isEmpty() const; void makeEmpty(); private: Array<DataType> elements; int top; }; #include "Stack.h" template <class DataType> CStack<DataType>::CStack() : elements(2),top(-1) { } template <class DataType> void CStack<DataType>::push(DataType elementToPush) { if (++top==elements.length()) { elements.ChangeSize(elements.length()<<1); } elements[top]=elementToPush; } template <class DataType> bool CStack<DataType>::pop(DataType & poppedElement) { if (top==-1) { return false; } poppedElement=elements[top]; top--; int trysize=elements.length(); while ((top+1<=trysize>>2) && trysize>2) { trysize >>=1; } if (trysize<elements.length()) { try { elements.ChangeSize(trysize); } catch (...) { } } return true; } template <class DataType> bool CStack<DataType>::peek(DataType & topElement) { if (top==-1) { return false; } topElement=elements[top]; return true; } template <class DataType> bool CStack<DataType>::isEmpty() const { return top==-1; } template <class DataType> void CStack<DataType>::makeEmpty() { top=-1; try { elements.ChangeSize(2); } catch (...) { } } #include <iostream> using namespace std; #include "Stack.cpp" void main() { int i=0; CStack<int> s; while (cin>>i) { if (i==0) { break; } s.push(i); } while (s.pop(i)) { cout<<i<<"/t"; } }