#include using namespace std; template class Stack { public: // Constructors, destructors and assignment operator Stack() { this->create(); } Stack( const Stack& s ) { copy( s ); } ~Stack() { delete v; } Stack& operator=( const Stack& s ); public: // Member functions and other operators bool empty() const; int size() const; void push( const T& t ); T pop(); void clear(); private: vector * v; // Pointer to allocated vector public: void create(); void copy( const Stack& s ); }; // create() template void Stack::create() { v = new vector; } // copy() template void Stack::copy( const Stack& s ) { // v = s.v; // copy all elements of s.v into v // v->operator=( s.v ); // this is the vector operator=() vector * p = s.v; // p points to the vector in Stack s for ( int i = 0 ; i < s.size() ; i++ ) { // v->push_back( p->operator[]( i ) ); // v->push_back( (*p).operator[]( i ) ); v->push_back( (*p)[i] ); } } // operator=() template Stack& Stack::operator=( const Stack& s ) { if ( this != &s ) // avoids s1 = s1; { clear(); copy( s ); } return *this; } // empty() template bool Stack::empty() const { // return ( size() == 0 ); if ( size() == 0 ) { return true; } else { return false; } } // size() template int Stack::size() const { return v->size(); } // clear() template void Stack::clear() { v->clear(); // while ( size() > 0 ) { // pop() OR v->pop_back() // } } // push() template void Stack::push( const T& t ) { v->push_back( t ); } // pop() template T Stack::pop() { T temp = v->operator[]( v->size() - 1 ); // get the last element v->pop_back(); return temp; }