Mercurial > Algorithms__Sedgewick
diff algs4-c++/src/Buffer.cpp @ 22:c2cbfdf528f6
1.3.44 Ugh. I would never use this in real life but it seems to be what they want.
author | Eris Caffee <discordia@eldalin.com> |
---|---|
date | Tue, 23 Jun 2015 11:02:31 -0500 |
parents | |
children |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/algs4-c++/src/Buffer.cpp Tue Jun 23 11:02:31 2015 -0500 1.3 @@ -0,0 +1,84 @@ 1.4 +// Sedgewick and Wayne, Algorithms, 4th ed. problem 1.3.44 1.5 + 1.6 +// I would never use this in real life. It's far too inefficient. 1.7 + 1.8 +#include "Buffer.hpp" 1.9 + 1.10 +Buffer::Buffer( void ) : 1.11 + cursor (0), 1.12 + use_s1 (true) 1.13 + { 1.14 + } 1.15 + 1.16 +void Buffer::insert( char c ) { 1.17 + if ( use_s1 ) { 1.18 + size_t i = 0; 1.19 + size_t max = s1.size(); 1.20 + while ( i != cursor ) 1.21 + s2.push( s1.pop() ); 1.22 + s2.push( c ); 1.23 + while ( i < max ) 1.24 + s2.push( s1.pop() ); 1.25 + } 1.26 + else { 1.27 + size_t i = 0; 1.28 + size_t max = s2.size(); 1.29 + while ( i != cursor ) 1.30 + s1.push( s2.pop() ); 1.31 + s1.push( c ); 1.32 + while ( i < max ) 1.33 + s1.push( s2.pop() ); 1.34 + } 1.35 + } 1.36 + 1.37 +char Buffer::get( void ) { 1.38 + if ( use_s1 ) 1.39 + return s1.find( cursor ); // Need to add overloaded T find( size_t k) to Stack 1.40 + else 1.41 + return s2.find( cursor ); 1.42 + } 1.43 + 1.44 +char Buffer::delete( void ) { 1.45 + if ( use_s1 ) { 1.46 + size_t i = 0; 1.47 + size_t max = s1.size(); 1.48 + while ( i != cursor ) 1.49 + s2.push( s1.pop() ); 1.50 + ++i; 1.51 + while ( i < max ) 1.52 + s2.push( s1.pop() ); 1.53 + } 1.54 + else { 1.55 + size_t i = 0; 1.56 + size_t max = s2.size(); 1.57 + while ( i != cursor ) 1.58 + s1.push( s2.pop() ); 1.59 + ++i; 1.60 + while ( i < max ) 1.61 + s1.push( s2.pop() ); 1.62 + } 1.63 + 1.64 + if ( cursor > size() ) 1.65 + cursor = size(); 1.66 + } 1.67 + 1.68 +void Buffer::left( size_t k ) { 1.69 + if ( cursor < k ) 1.70 + cursor = 0; 1.71 + else 1.72 + cursor -= k; 1.73 + } 1.74 + 1.75 +void Buffer::right( size_t k ) { 1.76 + if ( size() - cursor < k ) 1.77 + cursor = size(); 1.78 + else 1.79 + cursor += k; 1.80 + } 1.81 + 1.82 +size_t Buffer::size( void ) { 1.83 + if ( use_s1 ) 1.84 + return s1.size(); 1.85 + else 1.86 + return s2.size(); 1.87 + }