view algs4-c++/src/Queue.cpp @ 8:b02533162b6e

Linked list based Queue class.
author Eris Caffee <discordia@eldalin.com>
date Fri, 29 May 2015 21:13:32 -0500
parents
children eb159ea69f33
line source
1 // g++ -D QUEUE_MAIN -std=c++0x Queue.cpp
2 // g++ -D QUEUE_MAIN -std=c++11 Queue.cpp
5 #include "Queue.hpp"
7 #include <cassert>
8 #include <cstddef>
10 #include <iostream>
12 template <typename T>
13 Queue<T>::Queue( void ) :
14 N (0),
15 first (nullptr),
16 last (nullptr)
17 {
18 }
20 template <typename T>
21 Queue<T>::~Queue( void ) {
22 assert( N == 0 ); // Catch the potential memory leak.
23 while ( first ) {
24 Node *next = first->next;
25 delete first;
26 first = next;
27 }
28 }
30 template <typename T>
31 void Queue<T>::enqueue( T &item ) {
32 Node * node = new Node();
33 node->item = item;
34 node->next = nullptr;
36 if ( last ) {
37 last->next = node;
38 last = node;
39 }
40 else {
41 last = first = node;
42 }
44 N++;
45 }
47 template <typename T>
48 T Queue<T>::dequeue( void ) {
49 assert( N > 0 );
51 T item = first->item;
53 Node *old = first;
54 first = first->next;
55 delete old;
56 N--;
58 if ( ! first )
59 last = nullptr;
61 return item;
62 }
64 template <typename T>
65 bool Queue<T>::is_empty( void ) {
66 return N == 0;
67 }
69 template <typename T>
70 size_t Queue<T>::size( void ) {
71 return N;
72 }
74 template <typename T>
75 typename Queue<T>::iterator Queue<T>::begin( void ) {
76 return Queue<T>::iterator( first );
77 }
79 template <typename T>
80 typename Queue<T>::iterator Queue<T>::end( void ) {
81 return Queue<T>::iterator( nullptr );
82 }
85 ////////////////////////////////////////////////////////////////////////////////
87 template <typename T>
88 Queue<T>::iterator::iterator( Node *c ) :
89 curr (c)
90 {
91 }
93 template <typename T>
94 typename Queue<T>::iterator & Queue<T>::iterator::operator++() {
95 if ( this->curr != nullptr ) {
96 this->curr = this->curr->next;
97 }
98 return *this;
99 }
101 template <typename T>
102 typename Queue<T>::iterator Queue<T>::iterator::operator++( int ) {
103 auto t = Queue<T>::iterator( *this );
105 if ( this->curr != nullptr ) {
106 this->curr = this->curr->next;
107 }
108 return t;
109 }
111 template <typename T>
112 T Queue<T>::iterator::operator*() {
113 return this->curr->item;
114 }
116 template <typename T>
117 bool Queue<T>::iterator::operator!=( typename Queue<T>::iterator other ) {
118 return this->curr != other.curr;
119 }
122 ////////////////////////////////////////////////////////////////////////////////
124 #ifdef QUEUE_MAIN
126 #include <iostream>
128 int main ( int argc, char **argv ) {
130 Queue<long> queue;
132 long i;
133 while ( ! std::cin.eof() ) {
134 std::cin >> i;
135 if ( std::cin.good() )
136 if ( i >= 0 )
137 queue.enqueue(i);
138 else
139 queue.dequeue();
140 }
142 std::cout << "Queue has " << queue.size() << " entries." << std::endl;
144 for ( auto iter = queue.begin(); iter != queue.end(); ++iter ) {
145 std::cout << *iter << std::endl;
146 }
148 std::cout << "Dequeuing entries..." << std::endl;
150 while ( ! queue.is_empty() ) {
151 i = queue.dequeue();
152 std::cout << i << std::endl;
153 }
155 std::cout << "Queue has " << queue.size() << " entries." << std::endl;
157 }
159 #endif