Mercurial > Algorithms__Sedgewick
comparison 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 |
comparison
equal
deleted
inserted
replaced
0:1e815ab35362 | 1:e914eacc98b5 |
---|---|
1 // Linked list based steque after Sedgewick and Wayne, Algorithms 4th ed, Algorithm 1.2 | |
2 | |
1 #ifndef STEQUE_HPP | 3 #ifndef STEQUE_HPP |
2 #define STEQUE_HPP | 4 #define STEQUE_HPP |
3 | 5 |
6 #include <cassert> | |
4 #include <cstddef> | 7 #include <cstddef> |
5 | |
6 // Linked list based steque after Sedgewick and Wayne, Algorithms 4th ed, Algorithm 1.2 | |
7 | 8 |
8 template <typename T> | 9 template <typename T> |
9 class Steque { | 10 class Steque { |
10 | 11 |
11 private: | 12 private: |
61 Node *list; | 62 Node *list; |
62 | 63 |
63 }; | 64 }; |
64 | 65 |
65 | 66 |
67 //////////////////////////////////////////////////////////////////////////////// | |
68 | |
69 template <typename T> | |
70 Steque<T>::Steque( void ) : | |
71 N (0), | |
72 list (nullptr) | |
73 { | |
74 } | |
75 | |
76 template <typename T> | |
77 Steque<T>::~Steque( void ) { | |
78 assert( N == 0 ); // Catch the potential memory leak. | |
79 while ( list ) { | |
80 Node * next = list->next; | |
81 delete list; | |
82 list = next; | |
83 } | |
84 } | |
85 | |
86 template <typename T> | |
87 void Steque<T>::push( T &item ) { | |
88 Node * node = new Node(); | |
89 node->item = item; | |
90 node->next = list; | |
91 list = node; | |
92 N++; | |
93 } | |
94 | |
95 template <typename T> | |
96 T Steque<T>::pop( void ) { | |
97 assert( N > 0 ); | |
98 | |
99 T item = list->item; | |
100 | |
101 Node *old = list; | |
102 list = list->next; | |
103 delete old; | |
104 N--; | |
105 | |
106 return item; | |
107 } | |
108 | |
109 template <typename T> | |
110 void Steque<T>::enqueue( T &item ) { | |
111 Node *curr = list; | |
112 | |
113 Node *node = new Node(); | |
114 node->item = item; | |
115 node->next = nullptr; | |
116 | |
117 if ( ! curr ) { | |
118 list = node; | |
119 N++; | |
120 return; | |
121 } | |
122 | |
123 while ( curr->next ) { | |
124 curr = curr->next; | |
125 } | |
126 | |
127 curr->next = node; | |
128 N++; | |
129 | |
130 return; | |
131 } | |
132 | |
133 template <typename T> | |
134 bool Steque<T>::is_empty( void ) { | |
135 return N == 0; | |
136 } | |
137 | |
138 template <typename T> | |
139 size_t Steque<T>::size( void ) { | |
140 return N; | |
141 } | |
142 | |
143 template <typename T> | |
144 typename Steque<T>::iterator Steque<T>::begin( void ) { | |
145 return Steque<T>::iterator( list ); | |
146 } | |
147 | |
148 template <typename T> | |
149 typename Steque<T>::iterator Steque<T>::end( void ) { | |
150 return Steque<T>::iterator( nullptr ); | |
151 } | |
152 | |
153 | |
154 //////////////////////////////////////////////////////////////////////////////// | |
155 | |
156 template <typename T> | |
157 Steque<T>::iterator::iterator( Node *c ) : | |
158 curr (c) | |
159 { | |
160 } | |
161 | |
162 template <typename T> | |
163 typename Steque<T>::iterator & Steque<T>::iterator::operator++() { | |
164 if ( this->curr != nullptr ) { | |
165 this->curr = this->curr->next; | |
166 } | |
167 return *this; | |
168 } | |
169 | |
170 template <typename T> | |
171 typename Steque<T>::iterator Steque<T>::iterator::operator++( int ) { | |
172 auto t = Steque<T>::iterator( *this ); | |
173 | |
174 if ( this->curr != nullptr ) { | |
175 this->curr = this->curr->next; | |
176 } | |
177 return t; | |
178 } | |
179 | |
180 template <typename T> | |
181 T Steque<T>::iterator::operator*() { | |
182 return this->curr->item; | |
183 } | |
184 | |
185 template <typename T> | |
186 bool Steque<T>::iterator::operator!=( typename Steque<T>::iterator other ) { | |
187 return this->curr != other.curr; | |
188 } | |
189 | |
66 | 190 |
67 #endif | 191 #endif |
68 | 192 |