annotate algs4-c++/src/Steque.hpp @ 27:80ca1973e3bd

Fleshed out Queue::generic_iterator a bit more to make it a more or less complete example of implmenting an iterator.
author Eris Caffee <discordia@eldalin.com>
date Tue, 23 Jun 2015 17:14:09 -0500
parents 846aeab17939
children
rev   line source
discordia@18 1 // Linked list based steque after Sedgewick and Wayne, Algorithms 4th ed, Algorithm 1.2
discordia@18 2
discordia@11 3 #ifndef STEQUE_HPP
discordia@11 4 #define STEQUE_HPP
discordia@11 5
discordia@18 6 #include <cassert>
discordia@11 7 #include <cstddef>
discordia@11 8
discordia@11 9 template <typename T>
discordia@11 10 class Steque {
discordia@11 11
discordia@11 12 private:
discordia@11 13
discordia@11 14 ////////////////////////////////////
discordia@11 15 class Node {
discordia@11 16 public:
discordia@11 17 T item;
discordia@11 18 Node *next;
discordia@11 19 };
discordia@11 20
discordia@11 21
discordia@11 22 public:
discordia@11 23
discordia@11 24 ////////////////////////////////////
discordia@11 25 class iterator;
discordia@11 26 friend class iterator;
discordia@11 27 class iterator {
discordia@11 28
discordia@11 29 public:
discordia@11 30
discordia@11 31 iterator( Node *c );
discordia@11 32
discordia@11 33 iterator& operator++();
discordia@11 34 iterator operator++(int);
discordia@11 35
discordia@11 36 T operator*();
discordia@11 37 bool operator!=( typename Steque<T>::iterator );
discordia@11 38
discordia@11 39 private:
discordia@11 40
discordia@11 41 Node *curr;
discordia@11 42 };
discordia@11 43
discordia@11 44 ////////////////////////////////////
discordia@11 45
discordia@11 46 Steque( void );
discordia@11 47 ~Steque( void );
discordia@11 48
discordia@11 49 void push( T &item );
discordia@11 50 T pop( void );
discordia@11 51 void enqueue( T &item );
discordia@11 52
discordia@11 53 bool is_empty( void );
discordia@11 54 size_t size( void );
discordia@11 55
discordia@11 56 iterator begin( void );
discordia@11 57 iterator end( void );
discordia@11 58
discordia@11 59 private:
discordia@11 60
discordia@11 61 size_t N;
discordia@11 62 Node *list;
discordia@11 63
discordia@11 64 };
discordia@11 65
discordia@11 66
discordia@18 67 ////////////////////////////////////////////////////////////////////////////////
discordia@18 68
discordia@18 69 template <typename T>
discordia@18 70 Steque<T>::Steque( void ) :
discordia@18 71 N (0),
discordia@18 72 list (nullptr)
discordia@18 73 {
discordia@18 74 }
discordia@18 75
discordia@18 76 template <typename T>
discordia@18 77 Steque<T>::~Steque( void ) {
discordia@18 78 assert( N == 0 ); // Catch the potential memory leak.
discordia@18 79 while ( list ) {
discordia@18 80 Node * next = list->next;
discordia@18 81 delete list;
discordia@18 82 list = next;
discordia@18 83 }
discordia@18 84 }
discordia@18 85
discordia@18 86 template <typename T>
discordia@18 87 void Steque<T>::push( T &item ) {
discordia@18 88 Node * node = new Node();
discordia@18 89 node->item = item;
discordia@18 90 node->next = list;
discordia@18 91 list = node;
discordia@18 92 N++;
discordia@18 93 }
discordia@18 94
discordia@18 95 template <typename T>
discordia@18 96 T Steque<T>::pop( void ) {
discordia@18 97 assert( N > 0 );
discordia@18 98
discordia@18 99 T item = list->item;
discordia@18 100
discordia@18 101 Node *old = list;
discordia@18 102 list = list->next;
discordia@18 103 delete old;
discordia@18 104 N--;
discordia@18 105
discordia@18 106 return item;
discordia@18 107 }
discordia@18 108
discordia@18 109 template <typename T>
discordia@18 110 void Steque<T>::enqueue( T &item ) {
discordia@18 111 Node *curr = list;
discordia@18 112
discordia@18 113 Node *node = new Node();
discordia@18 114 node->item = item;
discordia@18 115 node->next = nullptr;
discordia@18 116
discordia@18 117 if ( ! curr ) {
discordia@18 118 list = node;
discordia@18 119 N++;
discordia@18 120 return;
discordia@18 121 }
discordia@18 122
discordia@18 123 while ( curr->next ) {
discordia@18 124 curr = curr->next;
discordia@18 125 }
discordia@18 126
discordia@18 127 curr->next = node;
discordia@18 128 N++;
discordia@18 129
discordia@18 130 return;
discordia@18 131 }
discordia@18 132
discordia@18 133 template <typename T>
discordia@18 134 bool Steque<T>::is_empty( void ) {
discordia@18 135 return N == 0;
discordia@18 136 }
discordia@18 137
discordia@18 138 template <typename T>
discordia@18 139 size_t Steque<T>::size( void ) {
discordia@18 140 return N;
discordia@18 141 }
discordia@18 142
discordia@18 143 template <typename T>
discordia@18 144 typename Steque<T>::iterator Steque<T>::begin( void ) {
discordia@18 145 return Steque<T>::iterator( list );
discordia@18 146 }
discordia@18 147
discordia@18 148 template <typename T>
discordia@18 149 typename Steque<T>::iterator Steque<T>::end( void ) {
discordia@18 150 return Steque<T>::iterator( nullptr );
discordia@18 151 }
discordia@18 152
discordia@18 153
discordia@18 154 ////////////////////////////////////////////////////////////////////////////////
discordia@18 155
discordia@18 156 template <typename T>
discordia@18 157 Steque<T>::iterator::iterator( Node *c ) :
discordia@18 158 curr (c)
discordia@18 159 {
discordia@18 160 }
discordia@18 161
discordia@18 162 template <typename T>
discordia@18 163 typename Steque<T>::iterator & Steque<T>::iterator::operator++() {
discordia@18 164 if ( this->curr != nullptr ) {
discordia@18 165 this->curr = this->curr->next;
discordia@18 166 }
discordia@18 167 return *this;
discordia@18 168 }
discordia@18 169
discordia@18 170 template <typename T>
discordia@18 171 typename Steque<T>::iterator Steque<T>::iterator::operator++( int ) {
discordia@18 172 auto t = Steque<T>::iterator( *this );
discordia@18 173
discordia@18 174 if ( this->curr != nullptr ) {
discordia@18 175 this->curr = this->curr->next;
discordia@18 176 }
discordia@18 177 return t;
discordia@18 178 }
discordia@18 179
discordia@18 180 template <typename T>
discordia@18 181 T Steque<T>::iterator::operator*() {
discordia@18 182 return this->curr->item;
discordia@18 183 }
discordia@18 184
discordia@18 185 template <typename T>
discordia@18 186 bool Steque<T>::iterator::operator!=( typename Steque<T>::iterator other ) {
discordia@18 187 return this->curr != other.curr;
discordia@18 188 }
discordia@18 189
discordia@11 190
discordia@11 191 #endif
discordia@11 192