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