# HG changeset patch # User Eris Caffee # Date 1432952012 18000 # Node ID b02533162b6ec2c848615f122df542281835b4aa # Parent a5052f77ba7e80371de3441d1dc8e29e8de73622 Linked list based Queue class. diff -r a5052f77ba7e -r b02533162b6e algs4-c++/src/Queue.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/algs4-c++/src/Queue.cpp Fri May 29 21:13:32 2015 -0500 @@ -0,0 +1,159 @@ +// g++ -D QUEUE_MAIN -std=c++0x Queue.cpp +// g++ -D QUEUE_MAIN -std=c++11 Queue.cpp + + +#include "Queue.hpp" + +#include +#include + +#include + +template +Queue::Queue( void ) : + N (0), + first (nullptr), + last (nullptr) + { + } + +template +Queue::~Queue( void ) { + assert( N == 0 ); // Catch the potential memory leak. + while ( first ) { + Node *next = first->next; + delete first; + first = next; + } + } + +template +void Queue::enqueue( T &item ) { + Node * node = new Node(); + node->item = item; + node->next = nullptr; + + if ( last ) { + last->next = node; + last = node; + } + else { + last = first = node; + } + + N++; + } + +template +T Queue::dequeue( void ) { + assert( N > 0 ); + + T item = first->item; + + Node *old = first; + first = first->next; + delete old; + N--; + + if ( ! first ) + last = nullptr; + + return item; + } + +template +bool Queue::is_empty( void ) { + return N == 0; + } + +template +size_t Queue::size( void ) { + return N; + } + +template +typename Queue::iterator Queue::begin( void ) { + return Queue::iterator( first ); + } + +template +typename Queue::iterator Queue::end( void ) { + return Queue::iterator( nullptr ); + } + + +//////////////////////////////////////////////////////////////////////////////// + +template +Queue::iterator::iterator( Node *c ) : + curr (c) + { + } + +template +typename Queue::iterator & Queue::iterator::operator++() { + if ( this->curr != nullptr ) { + this->curr = this->curr->next; + } + return *this; + } + +template +typename Queue::iterator Queue::iterator::operator++( int ) { + auto t = Queue::iterator( *this ); + + if ( this->curr != nullptr ) { + this->curr = this->curr->next; + } + return t; + } + +template +T Queue::iterator::operator*() { + return this->curr->item; + } + +template +bool Queue::iterator::operator!=( typename Queue::iterator other ) { + return this->curr != other.curr; + } + + +//////////////////////////////////////////////////////////////////////////////// + +#ifdef QUEUE_MAIN + +#include + +int main ( int argc, char **argv ) { + + Queue queue; + + long i; + while ( ! std::cin.eof() ) { + std::cin >> i; + if ( std::cin.good() ) + if ( i >= 0 ) + queue.enqueue(i); + else + queue.dequeue(); + } + + std::cout << "Queue has " << queue.size() << " entries." << std::endl; + + for ( auto iter = queue.begin(); iter != queue.end(); ++iter ) { + std::cout << *iter << std::endl; + } + + std::cout << "Dequeuing entries..." << std::endl; + + while ( ! queue.is_empty() ) { + i = queue.dequeue(); + std::cout << i << std::endl; + } + + std::cout << "Queue has " << queue.size() << " entries." << std::endl; + + } + +#endif diff -r a5052f77ba7e -r b02533162b6e algs4-c++/src/Queue.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/algs4-c++/src/Queue.hpp Fri May 29 21:13:32 2015 -0500 @@ -0,0 +1,66 @@ +#ifndef QUEUE_HPP +#define QUEUE_HPP + +#include + +// Linked list based queue after Sedgewick and Wayne, Algorithms 4th ed, Algorithm 1.3 + +template +class Queue { + +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 Queue::iterator ); + + private: + + Node *curr; + }; + + //////////////////////////////////// + + Queue( void ); + ~Queue( void ); + + void enqueue( T &item ); + T dequeue( void ); + + bool is_empty( void ); + size_t size( void ); + + iterator begin( void ); + iterator end( void ); + +private: + + size_t N; + Node *first; + Node *last; + + }; + + + +#endif +