The array-based queue implementation introduced in class uses a fixed length array. As a result, it is possible for the queue to become full.
- Rewrite the \(\texttt{enqueue}\) method so that it doubles the length of the array when the array is full.
- Rewrite the \(\texttt{dequeue}\) method so that it halves the length of the array when the array is less than half full.
Difficulty level
This exercise is mostly suitable for students
**************************************************
**************************************************
** **
** SOLUTION PROVIDED BY ABBAS KHREISS **
** **
**************************************************
**************************************************
#include<stdio.h>
#include<stdlib.h>
typedef int element;
typedef struct
{
element * data;
int front, length,maxSize;
} queue;
queue createQueue()
{
queue q;
q.length = 0;
q.front = 0;
q.maxSize = 1;
q.data = (element *)malloc(sizeof(element));
return q;
}
int isEmptyQueue(queue q)
{
return q.length == 0;
}
int Front(queue q, element * e)
{
if (isEmptyQueue(q)) return 0;
*e = q.data[q.front];
return 1;
}
int EnQueue(queue * q, element e)
{
element * tmp;
int i;
if (q->maxSize == q->length)
{
tmp= (element *)realloc(q->data, sizeof(element) * 2 * q->maxSize);
if (tmp)
q->data = tmp;
else return 0;
for (int i = 0; i < q->length; i++)
q->data[q->maxSize + i] = q->data[(q->front + i) % q->maxSize];
q->front = q->maxSize ;
q->maxSize *= 2;
}
q->data[(q->front + q->length) % q->maxSize] = e;
++q->length;
return 1;
}
int DeQueue(queue * q)
{
element *tmp;
int i;
if (isEmptyQueue(*q))
return 0;
if (q->length == 1)
{
q->length = 0;
return 1;
}
q->front = (q->front + 1) % q->maxSize;
--q->length;
if (q->length == q->maxSize / 2)
{
tmp = (element *)malloc(sizeof(element) * q->maxSize / 2);
if (!tmp)
return 0;
for (int i = 0; i < q->length; i++)
tmp[i] = q->data[(q->front + i) % q->maxSize];
free(q->data);
q->data = tmp;
q->maxSize /= 2;
q->front = 0;
}
return 1;
}
void displayQueue(queue q)
{
element e;
if (isEmptyQueue(q))
printf("Queue is Empty\n");
else printf("<----- ");
while (Front(q, &e))
{
DeQueue(&q);
printf("%d\t", e);
}
printf("\n\n", e);
}
queue copyQueue(queue q)
{
queue q1 = q;
element * tmp = (element *)malloc(sizeof(element)*q.maxSize);
for (int i = 0; i < q.maxSize; i++)
tmp[i] = q.data[i];
q1.data = tmp;
return q1;
}
int main()
{
element e;
queue q = createQueue();
displayQueue(q);
for (int i = 0; i <10; i++)
{
EnQueue(&q, i);
displayQueue(copyQueue(q));
}
printf("-------------------------------------------------------------------------------------\n");
while (Front(q, &e))
{
DeQueue(&q);
displayQueue(copyQueue(q));
}
return 0;
}
Back to the list of exercises
Looking for a more challenging exercise, try this one !!
UVA 10009 - All Roads Lead Where