template struct elem {T inf; elem* link; }; template class stack {public: stack(); ~stack(); stack(stack const &); stack& operator=(stack const & r); void push(T const&); int pop(T & x); bool empty() const; void Print(); private: elem *start; void delstack(); void copy(stack const&); }; template stack::stack() {start = NULL; } template stack::~stack() {delstack(); } template stack::stack(stack const & r) {copy(r); } template stack& stack::operator=(stack const& r) {if (this != &r) {delstack(); copy(r); } return *this; } template void stack::delstack() {elem *p; while (start) {p = start; start = start->link; delete p; } } template void stack::copy(stack const & r) {if (r.start) {elem *p = r.start, *q = NULL, *s=NULL; start = new elem; start->inf = p->inf; start->link = q; q = start; p = p->link; while (p) {s = new elem; s->inf = p->inf; q->link = s; q = s; p = p->link; } q->link = NULL; } else start = NULL; } template void stack::push(T const& s) {elem *p = start; start = new elem; start->inf = s; start->link = p; } template int stack::pop(T & s) {if (start) {s = start->inf; elem *p= start; start = start->link; delete p; return 1; } else return 0; } template void stack::Print() {T x; while (pop(x)) cout << x << " "; cout << endl; } template bool stack::empty() const {return start == NULL; }