comparison algs4-c++/src/Deque.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 1e3c509b6ac4
children
comparison
equal deleted inserted replaced
0:58225eb10c33 1:c38d6d294de6
1 // Linked list based deque after Sedgewick and Wayne, Algorithms 4th ed, Algorithm 1.3
2
1 #ifndef DEQUE_HPP 3 #ifndef DEQUE_HPP
2 #define DEQUE_HPP 4 #define DEQUE_HPP
3 5
6 #include <cassert>
4 #include <cstddef> 7 #include <cstddef>
5
6 // Linked list based deque after Sedgewick and Wayne, Algorithms 4th ed, Algorithm 1.3
7 8
8 template <typename T> 9 template <typename T>
9 class Deque { 10 class Deque {
10 11
11 private: 12 private:
64 Node *last; 65 Node *last;
65 66
66 }; 67 };
67 68
68 69
70 ////////////////////////////////////////////////////////////////////////////////
71
72 template <typename T>
73 Deque<T>::Deque( void ) :
74 N (0),
75 first (nullptr),
76 last (nullptr)
77 {
78 }
79
80 template <typename T>
81 Deque<T>::~Deque( void ) {
82 assert( N == 0 ); // Catch the potential memory leak.
83 while ( first ) {
84 Node *next = first->next;
85 delete first;
86 first = next;
87 }
88 }
89
90 template <typename T>
91 void Deque<T>::push_right( T &item ) {
92 Node * node = new Node();
93 node->item = item;
94 node->next = nullptr;
95 node->prev = nullptr;
96
97 if ( last ) {
98 last->next = node;
99 node->prev = last;
100 last = node;
101 }
102 else {
103 last = first = node;
104 }
105
106 N++;
107 }
108
109 template <typename T>
110 void Deque<T>::push_left( T &item ) {
111 Node * node = new Node();
112 node->item = item;
113 node->next = nullptr;
114 node->prev = nullptr;
115
116 if ( first ) {
117 node->next = first;
118 first->prev = node;
119 first = node;
120 }
121 else {
122 last = first = node;
123 }
124
125 N++;
126 }
127
128 template <typename T>
129 T Deque<T>::pop_left( void ) {
130 assert( N > 0 );
131
132 T item = first->item;
133
134 Node *old = first;
135 if ( first->next )
136 first->next->prev = nullptr;
137 first = first->next;
138 delete old;
139 N--;
140
141 if ( ! first )
142 last = nullptr;
143
144 return item;
145 }
146
147 template <typename T>
148 T Deque<T>::pop_right( void ) {
149 assert( N > 0 );
150
151 T item = last->item;
152
153 Node *old = last;
154 if ( last->prev )
155 last->prev->next = nullptr;
156 last = last->prev;
157 delete old;
158 N--;
159
160 if ( ! last )
161 first = nullptr;
162
163 return item;
164 }
165
166 template <typename T>
167 bool Deque<T>::is_empty( void ) {
168 return N == 0;
169 }
170
171 template <typename T>
172 size_t Deque<T>::size( void ) {
173 return N;
174 }
175
176 template <typename T>
177 typename Deque<T>::iterator Deque<T>::begin( void ) {
178 return Deque<T>::iterator( first );
179 }
180
181 template <typename T>
182 typename Deque<T>::iterator Deque<T>::end( void ) {
183 return Deque<T>::iterator( nullptr );
184 }
185
186
187 ////////////////////////////////////////////////////////////////////////////////
188
189 template <typename T>
190 Deque<T>::iterator::iterator( Node *c ) :
191 curr (c)
192 {
193 }
194
195 template <typename T>
196 typename Deque<T>::iterator & Deque<T>::iterator::operator++() {
197 if ( this->curr != nullptr ) {
198 this->curr = this->curr->next;
199 }
200 return *this;
201 }
202
203 template <typename T>
204 typename Deque<T>::iterator Deque<T>::iterator::operator++( int ) {
205 auto t = Deque<T>::iterator( *this );
206
207 if ( this->curr != nullptr ) {
208 this->curr = this->curr->next;
209 }
210 return t;
211 }
212
213 template <typename T>
214 T Deque<T>::iterator::operator*() {
215 return this->curr->item;
216 }
217
218 template <typename T>
219 bool Deque<T>::iterator::operator!=( typename Deque<T>::iterator other ) {
220 return this->curr != other.curr;
221 }
69 222
70 #endif 223 #endif
71 224