Ex3.3: Copiable Dynamical Size Stack
This commit is contained in:
parent
fa61fdaf21
commit
2ecd14cf94
4 changed files with 185 additions and 0 deletions
|
@ -9,6 +9,26 @@ class Stack {
|
||||||
public:
|
public:
|
||||||
Stack() { init( DELTA ); }
|
Stack() { init( DELTA ); }
|
||||||
Stack( int in_size ) { init(in_size); }
|
Stack( int in_size ) { init(in_size); }
|
||||||
|
|
||||||
|
Stack(const Stack& other) {
|
||||||
|
// Use init to set all vars naturally
|
||||||
|
init( other.bufsize ) ;
|
||||||
|
|
||||||
|
if ( s == other.s )
|
||||||
|
{
|
||||||
|
std::cout << "sAmE" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Then update the count as this is dependant on the copied Stack
|
||||||
|
count = other.count ;
|
||||||
|
|
||||||
|
// Copy elements
|
||||||
|
for ( int i=0 ; i < bufsize ; i++ ) {
|
||||||
|
s[i] = other.s[i] ;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
~Stack() {
|
~Stack() {
|
||||||
delete[] s;
|
delete[] s;
|
||||||
}
|
}
|
||||||
|
|
50
ex3.3/Stack.cc
Normal file
50
ex3.3/Stack.cc
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
//Stack.cc
|
||||||
|
#include <iostream>
|
||||||
|
#include "Stack.hh"
|
||||||
|
|
||||||
|
void Stack::push(double c) {
|
||||||
|
if (full()) {
|
||||||
|
std::cout << "Stack::push() Error: stack is full" << std::endl ;
|
||||||
|
|
||||||
|
grow( DELTA );
|
||||||
|
}
|
||||||
|
s[count++] = c ;
|
||||||
|
}
|
||||||
|
|
||||||
|
double Stack::pop() {
|
||||||
|
if (empty()) {
|
||||||
|
std::cout << "Stack::pop() Error: stack is empty" << std::endl ;
|
||||||
|
return 0 ;
|
||||||
|
}
|
||||||
|
return s[--count] ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Stack::inspect() {
|
||||||
|
for ( int i = nitems() - 1; i >= 0; i-- )
|
||||||
|
{
|
||||||
|
std::cout << i << ": " << s[i] << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Stack::init( int in_size ) {
|
||||||
|
bufsize = in_size ;
|
||||||
|
count = 0 ;
|
||||||
|
|
||||||
|
s = new double[in_size];
|
||||||
|
}
|
||||||
|
void Stack::grow( int delta ) {
|
||||||
|
std::cout << "Growing by " << delta << std::endl;
|
||||||
|
double* newbuf = new double[ bufsize + delta ];
|
||||||
|
|
||||||
|
// Copy elements
|
||||||
|
for ( int i=0; i < count ; i++ )
|
||||||
|
{
|
||||||
|
newbuf[i] = s[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete old Stack
|
||||||
|
delete[] s;
|
||||||
|
|
||||||
|
// Assign pointer
|
||||||
|
s = newbuf;
|
||||||
|
}
|
54
ex3.3/Stack.hh
Normal file
54
ex3.3/Stack.hh
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
//Stack.h
|
||||||
|
|
||||||
|
#ifndef STACK_H
|
||||||
|
#define STACK_H
|
||||||
|
|
||||||
|
const int DELTA = 5 ; // default growing size
|
||||||
|
class Stack {
|
||||||
|
// Interface
|
||||||
|
public:
|
||||||
|
Stack() { init( DELTA ); }
|
||||||
|
Stack( int in_size ) { init(in_size); }
|
||||||
|
|
||||||
|
Stack(const Stack& other) {
|
||||||
|
// Use init to set all vars naturally
|
||||||
|
init( other.bufsize ) ;
|
||||||
|
|
||||||
|
if ( s == other.s )
|
||||||
|
{
|
||||||
|
std::cout << "sAmE" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Then update the count as this is dependant on the copied Stack
|
||||||
|
count = other.count ;
|
||||||
|
|
||||||
|
// Copy elements
|
||||||
|
for ( int i=0 ; i < bufsize ; i++ ) {
|
||||||
|
s[i] = other.s[i] ;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
~Stack() {
|
||||||
|
delete[] s;
|
||||||
|
}
|
||||||
|
int nitems() { return count ; }
|
||||||
|
bool full() { return (count==bufsize) ; }
|
||||||
|
bool empty() { return (count==0) ; }
|
||||||
|
|
||||||
|
void push( double c );
|
||||||
|
double pop();
|
||||||
|
void inspect();
|
||||||
|
|
||||||
|
void grow( int delta );
|
||||||
|
|
||||||
|
// Implementation
|
||||||
|
private:
|
||||||
|
void init( int in_size );
|
||||||
|
|
||||||
|
double* s ;
|
||||||
|
int count ;
|
||||||
|
int bufsize ;
|
||||||
|
|
||||||
|
};
|
||||||
|
#endif
|
61
ex3.3/main.cpp
Normal file
61
ex3.3/main.cpp
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
#include <iostream>
|
||||||
|
#include "Stack.hh"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copiable Dynamically Sized Stack Implementation
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Initially this doesn't work because the s is a pointer to dynamic memory. This pointer is copied aswell so sclone operates on the same dynamic memory.
|
||||||
|
* By allocating new memory and copying the data the stacks can be actually independent.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using namespace std ;
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
Stack s ;// initialize Stack
|
||||||
|
|
||||||
|
// Write doubles into Stack
|
||||||
|
int i ;
|
||||||
|
for (i=0 ; i<10 ; i++) {
|
||||||
|
cout << "pushing value " << i*i << " in stack" << endl ;
|
||||||
|
s.push(i*i) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
cout << "Clone s to sclone" << endl;
|
||||||
|
Stack sclone = s;
|
||||||
|
|
||||||
|
cout << "Inspect s's FIFO" << endl;
|
||||||
|
s.inspect();
|
||||||
|
|
||||||
|
cout << "Inspect sclone's FIFO" << endl;
|
||||||
|
sclone.inspect();
|
||||||
|
//The Same Data
|
||||||
|
|
||||||
|
|
||||||
|
while (!s.empty()) {
|
||||||
|
double val = s.pop() ;
|
||||||
|
cout << "popping value " << val << " from stack" << endl ;
|
||||||
|
}
|
||||||
|
|
||||||
|
cout << "Inspect s's FIFO" << endl;
|
||||||
|
s.inspect();
|
||||||
|
|
||||||
|
cout << "Inspect sclone's FIFO" << endl;
|
||||||
|
sclone.inspect();
|
||||||
|
//Not the Same Data after copy constructor
|
||||||
|
|
||||||
|
for (int i = 0; i < 5 ; i++ )
|
||||||
|
{
|
||||||
|
s.push(100*i) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
cout << "Inspect s's FIFO" << endl;
|
||||||
|
s.inspect();
|
||||||
|
|
||||||
|
cout << "Inspect sclone's FIFO" << endl;
|
||||||
|
sclone.inspect();
|
||||||
|
//Not the Same Data after copy constructor
|
||||||
|
|
||||||
|
return 0 ;
|
||||||
|
}
|
Reference in a new issue