Если ваша очередь основана на массиве, то для эффективности я бы рекомендовал создать ограниченную или «круговую» очередь, где максимальный размер очереди фиксирован, и у вас в основном есть указатель на голову и хвост это указывает на «первую» и «последнюю» позиции в массиве очереди, и когда указатель хвоста (или индексное значение) перемещается в позицию «минус» конца массива, он фактически возвращается к началу массив. Неограниченная очередь, основанная на массиве, была бы ужасно неэффективной, так как вам нужно было бы перераспределять память каждый раз, когда вы заполняете максимальный размер массива и/или пытаетесь перетасовать элементы по массиву, когда вы удаляете первый элемент очереди.
Использование индексов массива интегрального типа для head
и tail
, а не фактические типов указателей, а также счетчиком для определения общего количества элементов в очереди, ваш Епдиеее и DEQUEUE функций могут выглядеть так же просто, как:
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 для доступа к главе очереди и фактически «удаление» элемента из очереди.
Является ли это домашнее задание? –
Если вы недостаточно понимаете, чтобы реализовать его с нуля, просто продолжайте использовать версию 'std', как вы показали. Если это домашнее задание, просто помните, что очередь сначала в первой. –
Я оспариваю ваше утверждение о том, что вы «знаете, как реализовать простую очередь». Пока вы только продемонстрировали, что можете использовать класс библиотеки под названием «queue». –