// Purpose. Bridge design pattern lab // // Problem. Our Stack class needs to allow the client to specify at // run-time what implementation strategy to employ (i.e. list vs array). // // Assignment. // o Rename the current Stack class to ArrayImp // o Create a base class called StackImp // o StackImp is a "pure abstract base class". It should declare 4 pure // virtual functions: push(), pop(), isEmpty(), and isFull() // o Derive classes ArrayImp and ListImp from class StackImp // o Create an interface (or wrapper, or handle) class called Stack // o The class Stack should contain a pointer to the abstract base class // StackImp. // o To initialize the StackImp pointer, Stack needs a constructor that // accepts one argument of type ImplementationType. In the body, you // create an instance of the derived class requested. If the client does // not supply an argument for the constructor, provide a default argument // of ArrayImplementation. // o Don't forget to write a destructor to clean-up the StackImp pointer // o The class Stack should have a method for anything a client might want to // do to a Stack object. Each method simply forwards the client request to // the appropriate method in its StackImp object. // o Un-comment the code in main() and test your results #include enum ImplementationType { ArrayImplementation, ListImplementation }; class Stack { public: Stack( int = 10 ); ~Stack(); void push( int val ); int pop(); int isEmpty(); int isFull(); private: int* _array; int _sp; int _size; }; class Node { public: Node( int val, Node* next ); int getValue(); Node* getNext(); private: int _value; Node* _next; }; class ListImp { public: ListImp(); ~ListImp(); void push( int val ); int pop(); int isEmpty(); int isFull(); private: Node* _head; }; void main ( void ) { Stack stack1; // Stack stack2( ListImplementation ); for (int i=1; i < 16; i++) { stack1.push( i ); // stack2.push( i ); } cout << "Array stack: "; for (i=1; i < 18 ; i++) cout << stack1.pop() << " "; cout << endl; // cout << "List stack: "; // for (i=1; i < 18 ; i++) // cout << stack2.pop() << " "; // cout << endl; } // Array stack: 10 9 8 7 6 5 4 3 2 1 0 0 0 0 0 0 0 // List stack: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 0 Stack::Stack( int size ) { _array = new int[size]; _size = size; _sp = 0; } Stack::~Stack() { delete _array; } void Stack::push( int val ) { if ( ! isFull()) _array[_sp++] = val; } int Stack::pop() { if (isEmpty()) return 0; else return _array[--_sp]; } int Stack::isEmpty() { return _sp == 0 ? 1 : 0; } int Stack::isFull() { return _sp == _size ? 1 : 0; } Node::Node( int val, Node* next ) { _value = val; _next = next; } int Node::getValue() { return _value; } Node* Node::getNext() { return _next; } ListImp::ListImp() { _head = NULL; } ListImp::~ListImp() { Node *current, *previous; current = _head; while (current) { previous = current; current = current->getNext(); delete previous; } } void ListImp::push( int val ) { Node* temp = new Node( val, _head ); _head = temp; } int ListImp::pop() { if (isEmpty()) return 0; Node* temp = _head; int val = _head->getValue(); _head = _head->getNext(); delete temp; return val; } int ListImp::isEmpty() { return _head ? 0 : 1; } int ListImp::isFull() { return 0; }