Hey all. I'm making a simple program to enqueue and dequeue a string of characters as entered into an array. I'm fairly close to completing the code but I've run into a bit of difficulty. After a certain number of enqueues/dequeues the operation seems to break down to the point where it doesn't display some of the members of the queue. Here's the code... and then with an example of what I mean.
Code:
void enqueue (char queue[], int &in, int &full)
{
char ch;
if (in == 4)
{ in = 0; }
if (full == 5)
{ cout << "Enqueue: Queue is full.\n\n"; }
else
{
cout << "Enqueue: ";
cin >> ch;
cout << endl;
queue[in] = ch;
in++, full++;
}
}
void dequeue (char queue[], int &out, int &full)
{
char ch;
if (out == 4)
{ out = 0; }
if (full == 1)
{ cout << "Dequeue: Queue is empty.\n"; }
else
{
ch = queue[out];
cout << "Dequeue: " << ch << endl;
out++, full--;
}
}
void display (char queue[], int &out, int &full)
{
cout << "Queue status:";
if (full == 1)
{ cout << " Empty"; }
for (int i = out; i <= (full+1); i++)
{ cout << " " << queue[i]; }
cout << endl << endl;
}
main ()
{
char selection ;
char mainqueue[4] ;
int n = 0, d = 0;
int full = 1;
/* Declare and initialize various counters. */
cout << endl ;
cout << "Enter e to enqueue, d to dequeue or q to quit." ;
cout << endl << endl << "e, d or q: " ;
cin >> selection ;
while ( ( selection == 'e' ) || ( selection == 'd' ) )
{
switch ( selection )
{
case 'e' : enqueue (mainqueue, n, full);
break ;
case 'd' : dequeue (mainqueue, d, full);
break ;
}
display (mainqueue, d, full) ;
cout << "e, d or q: " ;
cin >> selection ;
}
}
A sample output after several enqueue/dequeue progressions (my "notes" are in bold):
Code:
Enter e to enqueue, d to dequeue or q to quit.
FIRST RUN
e, d or q: e
Enqueue: a
Queue status: a
SECOND RUN
e, d or q: e
Enqueue: b
Queue status: a b
THIRD RUN
e, d or q: e
Enqueue: c
Queue status: a b c
FOURTH RUN
e, d or q: e
Enqueue: d
Queue status: a b c d
FIFTH RUN
e, d or q: e
Enqueue: Queue is full.
Queue status: a b c d
SIXTH RUN
e, d or q: d
Dequeue: a
Queue status: b c d
SEVENTH RUN
e, d or q: d
Dequeue: b
Queue status: c d
EIGHTH RUN
e, d or q: d
Dequeue: c
Queue status: d
NINTH RUN
e, d or q: d
Dequeue: d
Queue status: Empty
TENTH RUN -- HERE'S WHERE IT BREAKS DOWN
e, d or q: e
Enqueue: g
Queue status: Should output a "g" here...
ELEVENTH RUN
e, d or q: e
Enqueue: g
Queue status: Should output "g g" here
TWELFTH RUN
e, d or q: e
Enqueue: k
Queue status: Should show "g g k"...
THIRTEENTH RUN
e, d or q: e
Enqueue: l
Queue status: Should show "g g k l"...
RUN 14
e, d or q: e
Enqueue: Queue is full.
Queue status: Doesn't display queue again.
RUN 15
e, d or q: d
Dequeue: g
Queue status: g k l
e, d or q: d
Dequeue: g
Queue status: k l
e, d or q: d
Dequeue: k
Queue status: l
e, d or q: d
Dequeue: l
Queue status: Empty
e, d or q: q It runs fine for the dequeue as far as displaying the queue.
Basically, it doesn't display the queue after I've enqueued/dequeued a full (read: 4-element) queue. It was deemed to be a "circular" queue too. Any advice?