#include #include #include template class stack { protected: struct entry { T value; entry * next; entry(T, entry *); }; entry * end; public: stack(); bool empty(); void add(T); T take(); }; template stack :: entry :: entry(T v, entry * prev) { value = v; next = prev; } template stack :: stack() { end = NULL; } template bool stack :: empty() { return end == NULL; } template void stack :: add(T v) { end = new entry(v, end); } template T stack :: take() { assert(end != NULL); T v = end->value; entry * old_end = end; end = end->next; delete old_end; return v; } void main() { stack ss; stack si; ss.add("one"); si.add(1); ss.add("three"); si.add(3); ss.add("five"); ss.add("seven"); ss.add("nine"); si.add(5); si.add(7); ss.add("eleven"); ss.add("thirteen"); si.add(9); si.add(11); si.add(13); while (! ss.empty()) cout << ss.take() << " "; cout << "\n"; while (! si.empty()) cout << si.take() << " "; cout << "\n"; }