#include <iostream> using namespace std; template<typename T> class myStack; template<typename T> class node { friend class myStack<T>; T data; node *next, *parent; }; template<typename T> class myStack { public: myStack(); ~myStack(); void push(const T&); T& top(); void pop(); bool empty(); int size() { return length; } private: void destroy(); node<T> *bottom, *head; int length; }; template<typename T> myStack<T>::myStack() : bottom(0), head(0), length(0){ } template<typename T> myStack<T>::~myStack() { destroy(); } template<typename T> void myStack<T>::push(const T& val) { node<T> *t = new node<T>; t->data = val; t->next = 0; if(empty()) { head = bottom = t; head ->parent = 0; } else { head->next = t; t->parent = head; head = t; } length++; } template<typename T> T& myStack<T>::top() { return head->data; } template<typename T> void myStack<T>::pop() { node<T> *p = head; head = head->parent; delete p; length--; } template<typename T> bool myStack<T>:: empty() { return head == 0; } template<typename T> void myStack<T>::destroy() { while(!empty()) pop(); } int main(void) { myStack<int> st; for(int i = 1; i <= 10; ++i) { st.push(i); } cout << "size: " << st.size() << endl; for(int j = 0; j < 10; ++j) { if(!st.empty()) { cout << st.top() << endl; st.pop(); cout << "size: " << st.size() << endl; } } return 0; }