#include // Provides assert #include // Provides NULL and size_t #include "link2.h" // Linked list toolkit template class Stack { public: Stack( ) { top_ptr = NULL; } Stack(const Stack& source); ~Stack( ) { list_clear(top_ptr); } void push(const Item& entry); Item pop( ); void operator =(const Stack& source); size_t size( ) const { return list_length(top_ptr); } bool is_empty( ) const { return top_ptr == NULL; } Item peek( ) const; private: Node *top_ptr; // Points to top of stack }; template Stack::Stack(const Stack& source) { Node *tail_ptr; // Needed for argument of list_copy list_copy(source.top_ptr, top_ptr, tail_ptr); } template void Stack::push(const Item& entry) { list_head_insert(top_ptr, entry); } template Item Stack::pop( ) { Item answer; assert(!is_empty( )); answer = top_ptr->data; list_head_remove(top_ptr); return answer; } template void Stack::operator =(const Stack& source) { Node *tail_ptr; // Needed for argument of list_copy if (source.top_ptr == top_ptr) // Handle self-assignment return; list_clear(top_ptr); list_copy(source.top_ptr, top_ptr, tail_ptr); } // peek()