Чтобы реализовать очередь с использованием простых массивов, просто обработайте ее циклически - так что, как только у вас закончится свободное место в массиве, вернитесь обратно к 0. Вам нужно будет вести учет передней и задней части, так как вы нота. В качестве примера (где X представляет элемент в очереди):
// Rear is where to enqueue into, Front is where to dequeue from
Empty Array:
| - - - |
Front = -1, Rear = 0
Enqueue()
| X - - |
Front = 0, Rear = 1
Enqueue()
| X X - |
Front = 0, Rear = 2
Dequeue()
| - X - |
Front = 1, Rear = 2
Enqueue()
| - X X |
Front = 1, Rear = 0 // Looped around
Dequeue()
| - - X |
Front = 2, Rear = 0
Enqueue()
| X - X |
Front = 2, Rear = 1
Вам просто нужно использовать модульную арифметику, чтобы обернуться вокруг. Конечно, это ограничено по размеру (как только у вас закончатся элементы, вам придется выделять больше памяти), но это именно то, что вы получаете при работе с массивами.
Вот код для начала (я его вообще не проверял):
// Private class variables:
// These should be set in the constructor of your queue class
unsigned int rear = 0; // back of the queue
unsigned int front = -1; // front of the queue
unsigned int numStored = 0;
unsigned int length;
Object* array = new Object[length];
QueueAr::Enqueue(Object& obj)
{
if (front == rear)
{
// Throw an exception: queue is full!
}
else
{
array[rear] = obj; // Insert the object at the back
rear++;
rear = rear % length;
numStored++;
}
}
// For kicks, here's the queue code
QueueAr::Dequeue(Object& obj)
{
if (numStored == 0)
{
// Throw an exception: queue is empty!
}
front++;
front = front % length;
numStored--;
}