q=new T[maxn+1];
n=maxn+1;
head=n;
tail=0;
Вы создаете массив типа T с размером maxn + 1
Вы можете использовать только 0 до maxn;
настройка head = maxn+1
может вызвать проблемы, поскольку'\ 0' массива
Кроме того,
void put(T k)
{
a[tail++]=k;
tail=tail%n;
}
То, что вы здесь делаете, немного странно.Вы назначаете значение k на [tail], а затем увеличиваете tail на 1, а затем назначаете tail остаток от деления k с maxn + 1, который всегда будет таким же, как tail, если я не ошибаюсь?Разве это не избыточно?Представьте, что tail равен 2, а maxn равен 15, 2% 15 = 2. Как правило, весь ваш подход немного странный.
Может быть, вам стоит заняться изучением структур данных.Ищите Связанные Списки.Использование массивов для таких структур не является неправильным, но и неправильным.Что происходит, когда массив заполнен?Как вы собираетесь отслеживать все новые вставленные элементы в массиве после этого (при условии, что вы делаете пробел) и как вы узнаете, какие индексы свободны для вставки нового материала?