Если ваша очередь основана на массиве, то для эффективности я бы порекомендовал создать ограниченную или "круговую" очередь, в которой максимальный размер очереди фиксирован, а у вас в основном есть указатель head и tail, который указывают на «первую» и «последнюю» позиции в массиве очереди, и когда указатель хвоста (или значение индекса) перемещается в позицию «после» конца массива, он фактически возвращается к началу массив. Неограниченная очередь, основанная на массиве, будет ужасно неэффективной, поскольку вам нужно будет перераспределять память каждый раз, когда вы заполняете максимальный размер массива, и / или пытаться переставлять элементы в массиве при удалении первого элемент очереди.
Использование индексов массива целочисленного типа для head
и tail
, а не фактических типов указателей, а также счетчик для определения общего количества элементов в вашей очереди, ваши функции постановки в очередь и удаления могут выглядеть так просто:
template<typename T>
bool queue<T>::enqueue(const T& item)
{
if (count == array_size)
return false;
array[tail] = item;
tail = (tail + 1) % array_size;
count++;
return true;
}
template<typename T>
bool queue<T>::dequeue(T& item)
{
if (!count)
return false;
item = array[head];
head = (head + 1) % array_size;
count--;
return true;
}
Вы можете распространить эту концепцию на любые другие функции, которые вам нравятся, т. Е. Если вы предпочитаете использовать отдельные функции, такие как STL, для доступа к заголовку очереди и фактического «удаления» элемента из очереди.