摘自http://www.cnblogs.com/weichsel/archive/2010/09/14/1826300.html #include <iostream> //简单的队列实现 using namespace std; template<class T> class PStack { struct LINK { T* data; LINK* next; LINK(T* v, LINK* lk): data(v), next(lk) {} }* head; public: PStack(): head(NULL) {} ~PStack() { while (!head) { delete pop(); } } void add(T* val) { head = new LINK(val, head); } T* pop() { if (head == NULL) { return NULL; } T* data = head->data; LINK* old = head; head = head->next; delete old; return data; } class iterator; friend class iterator; class iterator { PStack* s; LINK* p; public: iterator(): s(NULL), p(NULL) {} iterator(PStack* v): s(v), p(v->head) {} iterator(PStack* v, bool): s(v), p(NULL) {} // copy constructor iterator(const iterator& it) { s = it.s; p = it.p; } // != bool operator!= (const iterator& it) { return (p != it.p); } // ++ void operator++(int) { if (p != NULL) { p = p->next; } } // * T* operator*() { if (p == NULL) { return NULL; } return p->data; } }; // create an iterator object iterator begin() { return iterator(this); } // create an iterator object iterator end() { return iterator(this, true); } }; int main() { PStack<int>s; PStack<int>::iterator it; s.add(new int(2)); s.add(new int(4)); s.add(new int(1)); s.add(new int(3)); for (it = s.begin(); it != s.end(); it++) { cout << *it << ":" << **it << endl; } return 0; }