Mercurial > Algorithms__Sedgewick
changeset 20:86281e8f24ba
1.3.39 CircularQueue (ring buffer)
author | Eris Caffee <discordia@eldalin.com> |
---|---|
date | Mon, 22 Jun 2015 15:38:25 -0500 |
parents | 60fb85712482 |
children | ec700842d182 |
files | algs4-c++/1.3.39 algs4-c++/src/CircularQueue.cpp algs4-c++/src/CircularQueue.hpp |
diffstat | 3 files changed, 123 insertions(+), 0 deletions(-) [+] |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/algs4-c++/1.3.39 Mon Jun 22 15:38:25 2015 -0500 1.3 @@ -0,0 +1,1 @@ 1.4 +src/CircularQueue.hpp 1.5 \ No newline at end of file
2.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 2.2 +++ b/algs4-c++/src/CircularQueue.cpp Mon Jun 22 15:38:25 2015 -0500 2.3 @@ -0,0 +1,37 @@ 2.4 +// g++ -std=c++11 CircularQueue.cpp 2.5 + 2.6 +#include <cstddef> 2.7 +#include <cstdlib> 2.8 +#include <iostream> 2.9 + 2.10 +#include "CircularQueue.hpp" 2.11 + 2.12 +int main( int argc, char **argv ) { 2.13 + size_t max; 2.14 + std::cin >> max; 2.15 + if ( ! std::cin.good() ) { 2.16 + std::cerr << "You must enter a size for the queue." << std::endl; 2.17 + exit( EXIT_FAILURE ); 2.18 + } 2.19 + 2.20 + CircularQueue<long> queue( max ); 2.21 + 2.22 + long i; 2.23 + while ( ! std::cin.eof() ) { 2.24 + std::cin >> i; 2.25 + if ( std::cin.good() ) { 2.26 + if ( queue.full() ) 2.27 + std::cout << "Queue is full: old data lost" << std::endl; 2.28 + queue.enqueue(i); 2.29 + } 2.30 + } 2.31 + 2.32 + std::cout << "Queue has " << queue.size() << " entries." << std::endl; 2.33 + 2.34 + std::cout << "Dequeuing entries:" << std::endl; 2.35 + while ( ! queue.empty() ) { 2.36 + long i = queue.dequeue(); 2.37 + std::cout << i << std::endl; 2.38 + } 2.39 + 2.40 + }
3.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 3.2 +++ b/algs4-c++/src/CircularQueue.hpp Mon Jun 22 15:38:25 2015 -0500 3.3 @@ -0,0 +1,85 @@ 3.4 +#ifndef CIRCULARQUEUE_HPP 3.5 + 3.6 +#define CIRCULARQUEUE_HPP 3.7 + 3.8 +#include <cassert> 3.9 +#include <cstddef> 3.10 +#include <vector> 3.11 + 3.12 +template <typename T> 3.13 +class CircularQueue { 3.14 +public: 3.15 + CircularQueue ( size_t max ); 3.16 + 3.17 + void enqueue( T &item); 3.18 + T dequeue( void ); 3.19 + 3.20 + bool empty( void ); 3.21 + bool full( void ); 3.22 + size_t size( void ); 3.23 + 3.24 +private: 3.25 + std::vector<T> data; 3.26 + size_t first; 3.27 + size_t end; 3.28 + size_t N; 3.29 + }; 3.30 + 3.31 + 3.32 +//////////////////////////////////////////////////////////////////////////////// 3.33 + 3.34 +template <typename T> 3.35 +CircularQueue<T>::CircularQueue( size_t max ) : 3.36 + first (0), 3.37 + end (0), 3.38 + N (0) 3.39 + { 3.40 + data.resize( max ); 3.41 + } 3.42 + 3.43 +template <typename T> 3.44 +void CircularQueue<T>::enqueue( T &item ) { 3.45 + data[end] = item; 3.46 + if ( N < data.size() ) 3.47 + ++N; 3.48 + else { 3.49 + ++first; 3.50 + if ( first > data.size() ) 3.51 + first = 0; 3.52 + } 3.53 + ++end; 3.54 + if ( end == data.size() ) 3.55 + end = 0; 3.56 + } 3.57 + 3.58 +template <typename T> 3.59 +T CircularQueue<T>::dequeue( void ) { 3.60 + assert( N > 0 ); 3.61 + T item = data[first]; 3.62 + if ( N > 0 ) 3.63 + --N; 3.64 + ++first; 3.65 + if ( first == data.size() ) 3.66 + first = 0; 3.67 + 3.68 + return item; 3.69 + } 3.70 + 3.71 +template <typename T> 3.72 +bool CircularQueue<T>::empty( void ) { 3.73 + return ( N == 0 ); 3.74 + } 3.75 + 3.76 +template <typename T> 3.77 +bool CircularQueue<T>::full( void ) { 3.78 + return ( N == data.size() ); 3.79 + } 3.80 + 3.81 +template <typename T> 3.82 +size_t CircularQueue<T>::size( void ) { 3.83 + return N; 3.84 + } 3.85 + 3.86 + 3.87 + 3.88 +#endif