# HG changeset patch # User Eris Caffee # Date 1433960486 18000 # Node ID 846aeab17939fa311192aa4c027b717ae22e3d09 # Parent 8af1a61be7c11e2fc719beda49221d5038fc174b Added Steque (exercise 1.3.32) diff -r 8af1a61be7c1 -r 846aeab17939 algs4-c++/src/Steque.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/algs4-c++/src/Steque.cpp Wed Jun 10 13:21:26 2015 -0500 @@ -0,0 +1,178 @@ +// g++ -D STEQUE_MAIN -std=c++0x Steque.cpp +// g++ -D STEQUE_MAIN -std=c++11 Steque.cpp + + +#include "Steque.hpp" + +#include +#include + +#include + +template +Steque::Steque( void ) : + N (0), + list (nullptr) + { + } + +template +Steque::~Steque( void ) { + assert( N == 0 ); // Catch the potential memory leak. + while ( list ) { + Node * next = list->next; + delete list; + list = next; + } + } + +template +void Steque::push( T &item ) { + Node * node = new Node(); + node->item = item; + node->next = list; + list = node; + N++; + } + +template +T Steque::pop( void ) { + assert( N > 0 ); + + T item = list->item; + + Node *old = list; + list = list->next; + delete old; + N--; + + return item; + } + +template +void Steque::enqueue( T &item ) { + Node *curr = list; + + Node *node = new Node(); + node->item = item; + node->next = nullptr; + + if ( ! curr ) { + list = node; + N++; + return; + } + + while ( curr->next ) { + curr = curr->next; + } + + curr->next = node; + N++; + + return; + } + +template +bool Steque::is_empty( void ) { + return N == 0; + } + +template +size_t Steque::size( void ) { + return N; + } + +template +typename Steque::iterator Steque::begin( void ) { + return Steque::iterator( list ); + } + +template +typename Steque::iterator Steque::end( void ) { + return Steque::iterator( nullptr ); + } + + +//////////////////////////////////////////////////////////////////////////////// + +template +Steque::iterator::iterator( Node *c ) : + curr (c) + { + } + +template +typename Steque::iterator & Steque::iterator::operator++() { + if ( this->curr != nullptr ) { + this->curr = this->curr->next; + } + return *this; + } + +template +typename Steque::iterator Steque::iterator::operator++( int ) { + auto t = Steque::iterator( *this ); + + if ( this->curr != nullptr ) { + this->curr = this->curr->next; + } + return t; + } + +template +T Steque::iterator::operator*() { + return this->curr->item; + } + +template +bool Steque::iterator::operator!=( typename Steque::iterator other ) { + return this->curr != other.curr; + } + +//////////////////////////////////////////////////////////////////////////////// + + + +#ifdef STEQUE_MAIN + +#include + +int main ( int argc, char **argv ) { + + Steque steque; + bool push_it = true; + + long i; + while ( ! std::cin.eof() ) { + std::cin >> i; + if ( std::cin.good() ) { + if ( push_it ) { + steque.push( i ); + push_it = false; + } + else { + steque.enqueue( i ); + push_it = true; + } + } + } + + std::cout << "Steque has " << steque.size() << " entries." << std::endl; + + for ( auto iter = steque.begin(); iter != steque.end(); ++iter ) { + std::cout << *iter << std::endl; + } + + std::cout << "Popping entries..." << std::endl; + + while ( ! steque.is_empty() ) { + i = steque.pop(); + std::cout << i << std::endl; + } + + std::cout << "Steque has " << steque.size() << " entries." << std::endl; + + } + +#endif diff -r 8af1a61be7c1 -r 846aeab17939 algs4-c++/src/Steque.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/algs4-c++/src/Steque.hpp Wed Jun 10 13:21:26 2015 -0500 @@ -0,0 +1,68 @@ +#ifndef STEQUE_HPP +#define STEQUE_HPP + +#include + +// Linked list based steque after Sedgewick and Wayne, Algorithms 4th ed, Algorithm 1.2 + +template +class Steque { + +private: + + //////////////////////////////////// + class Node { + public: + T item; + Node *next; + }; + + +public: + + //////////////////////////////////// + class iterator; + friend class iterator; + class iterator { + + public: + + iterator( Node *c ); + + iterator& operator++(); + iterator operator++(int); + + T operator*(); + bool operator!=( typename Steque::iterator ); + + private: + + Node *curr; + }; + + //////////////////////////////////// + + Steque( void ); + ~Steque( void ); + + void push( T &item ); + T pop( void ); + void enqueue( T &item ); + + bool is_empty( void ); + size_t size( void ); + + iterator begin( void ); + iterator end( void ); + +private: + + size_t N; + Node *list; + + }; + + + +#endif +