# HG changeset patch # User Eris Caffee # Date 1435075351 18000 # Node ID c2cbfdf528f6db84ea8e1a46476547e49f06ce0c # Parent ec700842d1825440aab04aee89a7f692afb35ff4 1.3.44 Ugh. I would never use this in real life but it seems to be what they want. diff -r ec700842d182 -r c2cbfdf528f6 algs4-c++/1.3.44 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/algs4-c++/1.3.44 Tue Jun 23 11:02:31 2015 -0500 @@ -0,0 +1,1 @@ +src/Buffer.hpp \ No newline at end of file diff -r ec700842d182 -r c2cbfdf528f6 algs4-c++/src/Buffer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/algs4-c++/src/Buffer.cpp Tue Jun 23 11:02:31 2015 -0500 @@ -0,0 +1,84 @@ +// Sedgewick and Wayne, Algorithms, 4th ed. problem 1.3.44 + +// I would never use this in real life. It's far too inefficient. + +#include "Buffer.hpp" + +Buffer::Buffer( void ) : + cursor (0), + use_s1 (true) + { + } + +void Buffer::insert( char c ) { + if ( use_s1 ) { + size_t i = 0; + size_t max = s1.size(); + while ( i != cursor ) + s2.push( s1.pop() ); + s2.push( c ); + while ( i < max ) + s2.push( s1.pop() ); + } + else { + size_t i = 0; + size_t max = s2.size(); + while ( i != cursor ) + s1.push( s2.pop() ); + s1.push( c ); + while ( i < max ) + s1.push( s2.pop() ); + } + } + +char Buffer::get( void ) { + if ( use_s1 ) + return s1.find( cursor ); // Need to add overloaded T find( size_t k) to Stack + else + return s2.find( cursor ); + } + +char Buffer::delete( void ) { + if ( use_s1 ) { + size_t i = 0; + size_t max = s1.size(); + while ( i != cursor ) + s2.push( s1.pop() ); + ++i; + while ( i < max ) + s2.push( s1.pop() ); + } + else { + size_t i = 0; + size_t max = s2.size(); + while ( i != cursor ) + s1.push( s2.pop() ); + ++i; + while ( i < max ) + s1.push( s2.pop() ); + } + + if ( cursor > size() ) + cursor = size(); + } + +void Buffer::left( size_t k ) { + if ( cursor < k ) + cursor = 0; + else + cursor -= k; + } + +void Buffer::right( size_t k ) { + if ( size() - cursor < k ) + cursor = size(); + else + cursor += k; + } + +size_t Buffer::size( void ) { + if ( use_s1 ) + return s1.size(); + else + return s2.size(); + } diff -r ec700842d182 -r c2cbfdf528f6 algs4-c++/src/Buffer.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/algs4-c++/src/Buffer.hpp Tue Jun 23 11:02:31 2015 -0500 @@ -0,0 +1,34 @@ +// Sedgewick and Wayne, Algorithms, 4th ed. problem 1.3.44 + +// Two stack implementation. I don't know why anyone would actually want to use +// an implmentation like this, but it's what they suggested in the problem. I +// guess it's just an "exercise" after all. + + +#ifndef BUFFER_HPP +#define BUFFER_HPP + +#include + +#include "Stack.hpp" + +class Buffer { +public: + Buffer( void ); + + void insert( char c ); + char get( void ); + char delete( void ); + void left( size_t k ); + void right( size_t k ); + size_t size( void ); + +private: + size_t cursor; + + bool use_s1; + Stack s1; + Stack s2; + }; + +#endif