2016-12-08 3 views
0

Я помещаю игру в эту очередь, для игры «припаркованной машины», и она должна выйти с 75 ходами для решения головоломки. Тем не менее, очередь продолжает переполняться, что приводит к тому, что перемещение не помещается в очередь, что делает решение более чем на 75 ходов. Примечание. Невозможно изменить размер очереди, он является постоянным. Есть идеи?Backtracing Queue

int enqueue(position* p){ 
Q[qrear] = p; 
qrear = qrear + 1; 
if (qrear == QueueArraySize) { 
    qrear = 0; 
} 
qsize = qsize + 1; 
return 0; 
} /*End of insert()*/ 

position* dequeue(){ 
if (qsize == 0) { 
    printf("Queue Underflow \n"); 
    return NULL; 
} 
else { 
    position* temp = Q[qfront]; 
    qfront = qfront + 1; 
    if (qfront == QueueArraySize) { 
     qfront = 0; 
    } 
    qsize = qsize - 1; 
    return temp; 
}   

}

+0

как вы инициализируете Q? – koper89

+0

И я бы предложил передать структуру Q в этих функциях, используя глобальные переменные - не слишком хорошая идея. структура, которая содержит размер, задний, передний и размер. И вы должны поместить NULL в Q [qfront] после того, как вы перейдете к temp. – koper89

+0

@ koper89 position * Q [QueueArraySize]; –

ответ

0

Я подозреваю, ваша проблема в том, что QSize может получить больше, чем QueueArraySize, но количество элементов в очереди ограничено QueueArraySize.

enqueue не может «терпеть неудачу», он всегда помещает позицию в очередь и всегда увеличивает размер очереди, даже когда он обращается к началу Q (это может быть переписывание позиций в начале очереди) ,

Другое дело, что вы не обращаете внимания на отношения между qrear и qfront. Представьте, что QueueArraySize равно 10, и вы вставляете 12 позиций, qfront по-прежнему будет указывать на Q [0] (так как вы еще ничего не потеряли), но это не правильный «фронт» очереди, поскольку Q [0] и Q [1] были перезаписаны 11-й и 12-й позициями, которые вы указали. В этом случае q-фронт должен быть Q [2]. Вы должны переместить qfront, если вы enqueuing в gfront, и вы должны переместить qrear, если вы уклоняетесь от qrear.