# HG changeset patch # User Eris Caffee # Date 1432950738 18000 # Node ID 438f5608900e9c569b669b5dfa32ab834d5a1ea1 # Parent 3db1a894bbdf8e9488c4bbfd10018c8d1e531a58 Linked list based Stack class. diff -r 3db1a894bbdf -r 438f5608900e algs4-c++/src/Stack.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/algs4-c++/src/Stack.cpp Fri May 29 20:52:18 2015 -0500 @@ -0,0 +1,144 @@ +// g++ -D STACK_MAIN -std=c++0x Stack.cpp +// g++ -D STACK_MAIN -std=c++11 Stack.cpp + + +#include "Stack.hpp" + +#include +#include + +#include + +template +Stack::Stack( void ) : + N (0), + list (nullptr) + { + } + +template +Stack::~Stack( void ) { + assert( N == 0 ); // Catch the potential memory leak. + while ( list ) { + Node * next = list->next; + delete list; + list = next; + } + } + +template +void Stack::push( T &item ) { + Node * node = new Node(); + node->item = item; + node->next = list; + list = node; + N++; + } + +template +T Stack::pop( void ) { + assert( N > 0 ); + + T item = list->item; + + Node *old = list; + list = list->next; + delete old; + N--; + + return item; + } + +template +bool Stack::is_empty( void ) { + return N == 0; + } + +template +size_t Stack::size( void ) { + return N; + } + +template +typename Stack::iterator Stack::begin( void ) { + return Stack::iterator( list ); + } + +template +typename Stack::iterator Stack::end( void ) { + return Stack::iterator( nullptr ); + } + + +//////////////////////////////////////////////////////////////////////////////// + +template +Stack::iterator::iterator( Node *c ) : + curr (c) + { + } + +template +typename Stack::iterator & Stack::iterator::operator++() { + if ( this->curr != nullptr ) { + this->curr = this->curr->next; + } + return *this; + } + +template +typename Stack::iterator Stack::iterator::operator++( int ) { + auto t = Stack::iterator( *this ); + + if ( this->curr != nullptr ) { + this->curr = this->curr->next; + } + return t; + } + +template +T Stack::iterator::operator*() { + return this->curr->item; + } + +template +bool Stack::iterator::operator!=( typename Stack::iterator other ) { + return this->curr != other.curr; + } + + +//////////////////////////////////////////////////////////////////////////////// + +#ifdef STACK_MAIN + +#include + +int main ( int argc, char **argv ) { + + Stack stack; + + long i; + while ( ! std::cin.eof() ) { + std::cin >> i; + if ( std::cin.good() ) + stack.push(i); + } + + std::cout << "Stack has " << stack.size() << " entries." << std::endl; + + for ( auto iter = stack.begin(); iter != stack.end(); ++iter ) { + std::cout << *iter << std::endl; + } + + std::cout << "Popping entries..." << std::endl; + + while ( ! stack.is_empty() ) { + i = stack.pop(); + std::cout << i << std::endl; + } + + std::cout << "Stack has " << stack.size() << " entries." << std::endl; + + } + +#endif diff -r 3db1a894bbdf -r 438f5608900e algs4-c++/src/Stack.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/algs4-c++/src/Stack.hpp Fri May 29 20:52:18 2015 -0500 @@ -0,0 +1,66 @@ +#ifndef STACK_HPP +#define STACK_HPP + +#include + +// Linked list based stack after Sedgewick and Wayne, Algorithms 4th ed, Algorithm 1.2 + +template +class Stack { + +public: + + //////////////////////////////////// + class Node { + public: + T item; + Node *next; + }; + + + //////////////////////////////////// + class iterator; + friend class iterator; + class iterator { + + public: + + iterator( Node *c ); + + iterator& operator++(); + iterator operator++(int); + + T operator*(); + bool operator!=( typename Stack::iterator ); + + private: + + Node *curr; + }; + + //////////////////////////////////// + + Stack( void ); + ~Stack( void ); + + void push( T &item ); + T pop( void ); + + bool is_empty( void ); + size_t size( void ); + + iterator begin( void ); + iterator end( void ); + +private: + + size_t N; + Node *list; + + void resize( size_t new_max ); + }; + + + +#endif +