//
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 <iostream.h>
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