Я изучаю очереди и пытаюсь написать метод для изменения максимальной емкости циклической очереди с использованием динамического массива. Вот как выглядит мой код прямо сейчас.
void ArrayQueue::setCapacity(unsigned newCapacity){
if(newCapacity == 0 || newCapacity < this->getSize()){
throw QueueException("setCapacity()", "invalid new capacity");
} else if(newCapacity != this->getSize()){
Item * tempArray = new Item[newCapacity];
for(unsigned i=0; i<newCapacity; i++){
tempArray[i] = myArray[i];
}
Item * oldArray = myArray;
myArray = tempArray;
delete [] oldArray;
}
this->myCapacity = newCapacity;
}
Однако, когда я уменьшаю емкость, мне не удается получить значения myFirst и myLast. Я понимаю, что мне нужно написать код для учета случая, когда записи перевернуты, но не понимаю, как это сделать.
Тест, который я пытаюсь пройти, имеет следующий код:
ArrayQueue q5(10);
for (int i = 0; i < 10; i++){
q5.append(i+1);
}
for (int i = 0; i < 7; i++){
q5.remove();
}
assert( q5.getCapacity() == 10 );
assert( q5.getSize() == 3 );
assert( !q5.isEmpty() );
assert( !q5.isFull() );
assert( q5.getFirst() == 8 );
assert( q5.getLast() == 10 );
//reduce the capacity
q5.setCapacity(5);
assert( q5.getCapacity() == 5 );
assert( q5.getSize() == 3 );
assert( !q5.isEmpty() );
assert( !q5.isFull() );
assert( q5.getFirst() == 8 );
assert( q5.getLast() == 10 );
Я передаю свой первый набор утверждений, но второе утверждение getFirst терпит неудачу.
Не могли бы вы дать мне указатель в правильном направлении? Спасибо.
myArray[i]
будет считываться за пределы, если вы когда-нибудь увеличите очередь. - person Red Alert   schedule 16.11.2014