Способ изменения емкости очереди Переполнение стека

unsigned mySize;       // number of items I contain
unsigned myCapacity;   // how many items I can store
unsigned myFirst;      // index of oldest item (if any)
unsigned myLast;       // index of next available spot for append (if any)
Item*    myArray;      // dynamic array of items

Я создаю класс очереди на основе динамического массива, и мне нужно создать метод, который изменяет количество элементов, которые может содержать очередь. Мне нужно, чтобы «myLast» оставался точным после изменения емкости, особенно в очереди, в которой уже были сняты элементы с фронта.

void ArrayQueue<Item>::setCapacity(unsigned cap) {
if (cap < getSize() || cap == 0){
throw QueueException("setCapacity()", "New capacity must be greater than size");
} else {
Item * nq = new Item[cap];
for (unsigned i = 0; i < cap; i++){
nq[i] = myArray[i];
}
delete [] myArray;
myArray = nq;
myCapacity = cap;
//what do I put here to make myFirst and myLast be correct for the new capcacity?
}
}

Кто-нибудь может объяснить, как это сделать?

0

Решение

Ничто — ни myFirst, ни myLast не изменятся с тем, что у вас есть — если вы используете циклическую очередь (и я уверен, что вы есть), и в этом случае вы не можете просто скопировать исходный массив поверх нового массива. Если вы просто скопируете старый массив поверх нового, любые обернутые записи окажутся не на своем месте. Вы должны справиться с возможностью того, что это обернулось вокруг.

И у вас есть проблема с вашим циклом:

for (unsigned i = 0; i < cap; i++){
nq[i] = myArray[i];
}

Он выйдет из конца myArray, если cap больше, чем myCapacity (например, размер myArray).

0

Другие решения

Вы можете изменить свой контейнер в очереди, если хотите.

 std::queue<int,std::list<int>> myQueue

как это…

0

По вопросам рекламы [email protected]