// Purpose. Adapter design pattern lab // // Problem. Simulated here is a "stack machine", or a non-OO // implementation of a Stack class. We would like to reuse this "legacy" // asset as the basis for a new Queue class, but there is an "impedance // mismatch" between the old and the new. // // Assignment. // o The class Queue should contain an "instance" of component Stack. // o Queue needs a ctor, dtor, enque, deque, and isEmpty methods. Each of // these methods will provide an adaptation from the Queue interface to the // Stack implementation. // o If you map Queue's enque() to Stack's push(), then the pseudocode below // will give you insight into implementing Queue's deque() method. #include struct StackStruct { int* array; int sp; int size; }; typedef StackStruct Stack; static void initialize( Stack* s, int size ) { s->array = new int[size]; s->size = size; s->sp = 0; } static void cleanUp( Stack* s ) { delete s->array; } static int isEmpty( Stack* s ) { return s->sp == 0 ? 1 : 0; } static int isFull( Stack* s ) { return s->sp == s->size ? 1 : 0; } static void push( Stack* s, int item ) { if ( ! isFull(s)) s->array[s->sp++] = item; } static int pop( Stack* s ) { if (isEmpty(s)) return 0; else return s->array[--s->sp]; } class Queue { deque pseudocode: initialize a local temporary instance of Stack loop pop() the permanent stack and push() the temporary stack pop() the temporary stack and remember this value loop pop() the temporary stack and push() the permanent stack cleanUp the temporary stack return the remembered value int isFull() { return ::isFull( &_stack ); } }; void main( void ) { Queue queue(15); for (int i=0; i < 25; i++) queue.enque( i ); while ( ! queue.isEmpty()) cout << queue.deque() << " "; cout << endl; } // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14