# HG changeset patch # User Eris Caffee # Date 1432682296 18000 # Node ID ca59e5f5b29e29a77bc0d002bc607b631856b9e3 # Parent d1e563e7873f9f7878c888fbbd0afb89230c73fd Initial, imcomplete, C++ version of ResizingArrayStack. diff -r d1e563e7873f -r ca59e5f5b29e .hgignore --- a/.hgignore Sat May 23 20:44:30 2015 -0500 +++ b/.hgignore Tue May 26 18:18:16 2015 -0500 @@ -2,3 +2,4 @@ algs4/algs4-code/.* .*~$ .*\.class$ +a\.out$ diff -r d1e563e7873f -r ca59e5f5b29e algs4-c++/src/ResizingArrayStack.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/algs4-c++/src/ResizingArrayStack.cpp Tue May 26 18:18:16 2015 -0500 @@ -0,0 +1,83 @@ +// g++ -std=c++0x ResizingArrayStack.cpp +// g++ -std=c++11 ResizingArrayStack.cpp + + +#include "ResizingArrayStack.hpp" + +#include +#include + +#include + +template ResizingArrayStack::ResizingArrayStack( void ) : + N (0), + max(1) { + data = new T[1]; + } + +template ResizingArrayStack::~ResizingArrayStack( void ) { + assert( N == 0 ); // Catch the potential memory leak. + if ( data ) + delete data; + } + +template void ResizingArrayStack::push( T &item ) { + if ( max == N ) + resize( 2 * max ); + data[N++] = item; + } + +template T ResizingArrayStack::pop( void ) { + assert( N > 0 ); + T item = data[N-1]; + data[N-1] = NULL; + N--; + + if ( N <= max/4 ) + resize( max/2 ); + + return item; + } + +template bool ResizingArrayStack::is_empty( void ) { + return N == 0; + } + +template size_t ResizingArrayStack::size( void ) { + return N; + } + +template void ResizingArrayStack::resize( size_t new_max ) { + T *new_data = new T[new_max]; + for ( size_t i = 0; i < N; ++i ) + new_data[i] = data[i]; + T *old_data = data; + data = new_data; + delete old_data; + max = new_max; + } + +#ifdef RESIZINGARRAYSTACK_MAIN + +#include + +int main ( int argc, char **argv ) { + + ResizingArrayStack stack; + + long i; + while ( ! std::cin.eof() ) { + std::cin >> i; + if ( std::cin.good() ) + stack.push(i); + } + + std::cout << "Stack has " << stack.size() << " entries." << std::endl; + + while ( ! stack.is_empty() ) { + i = stack.pop(); + std::cout << i << std::endl; + } + } + +#endif diff -r d1e563e7873f -r ca59e5f5b29e algs4-c++/src/ResizingArrayStack.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/algs4-c++/src/ResizingArrayStack.hpp Tue May 26 18:18:16 2015 -0500 @@ -0,0 +1,37 @@ +#ifndef RESIZINGARRAYSTACK_HPP +#define RESIZINGARRAYSTACK_HPP + +#include + +template +class ResizingArrayStack { + +public: + + ResizingArrayStack( void ); + ~ResizingArrayStack( void ); + + void push( T &item ); + T pop( void ); + + bool is_empty( void ); + size_t size( void ); + + // class iterator; + // friend class iterator; + // class iterator { + // }; + +private: + + size_t N; + size_t max; + T *data; + + void resize( size_t new_max ); + }; + + + +#endif +