Случай вставки массива в кольцевую очередь
У меня есть код для реализации этого довольно близко к завершению, что вызывает мою ошибку IndexOutofBounds, кажется, происходит в одном случае вставки в очередь. Есть идеи? В начале моего класса я установил задние и передние -1, а счетчик - 0. Максимальный размер массива - 100. Существует класс isfull, который проверяет, является ли счетчик максимальным размером.
public boolean insert(int n){
if (isFull()){
//not inserted
return false;
}
else{
//make it the first in queue if queue is empty
if ( front == -1 && rear == -1){
front++;
rear++;
list[front] = n;
list[rear] = n;
count++;
return true;
}
//not at end of queue, add to end
else if ( (count+1) <= 100 ){
rear++;
list[rear] = n;
count++;
return true;
}
//else add to front
else{
//update rear
rear = ((count+1)%100)-1;
list[rear] = n;
return true;
}
}
}
Этот код до сих пор вставляет число в массив в следующем порядке: 0. Проверьте, не заполнено ли оно. Если это выход. 1. Если очередь пуста, сделайте ее первым элементом там. 2. Если очередь не пуста или не заполнена, проверьте, не превышает ли задняя часть массива максимальное количество точек. Если это не так, добавьте его в конец. 3. Если очередь не пуста или не заполнена, но задняя часть очереди заполнена. Зациклиться и вставить его в начало массива.
Проблема в том случае, когда, например: - Массив заполнен числами 1-100. На этом этапе массив заполнен. - Снимите лицевую панель, чтобы массив шел от 2 до 100, а первый слот пуст. - Введите номер, который вы только что удалили, это вызывает ошибку. В этот момент число +1 не превышает максимальное количество мест, поэтому он пытается добавить его в тыл. Но так как последнее место заполнено, оно не зацикливается, выбрасывая массив за пределы исключения. Что я могу добавить, чтобы проверить, заполнено ли последнее место, и добавить в начало массива в этом случае?
Мой метод удаления:
public int remove(){
//if empty return -1
if (isEmpty()){
return -1;
}
else{//else remove
front++;
int x = list[front-1];
count--;
return x;
}
}
1 ответ
public boolean insert(int n){
if (isFull()){
//not inserted
return false;
}
else{
//make it the first in queue if queue is empty
if (isEmpty()){ //use empty
front=0;//just set it
rear=0;//just set it
}
list[rear] = n;
rear = (rear+1)%100; //just rewind it when it reaches 100 index 0 must be free at this point
count++;
return true;
}
}
Я полагаю count
количество элементов, так что удалить следует сделать count--
, в этом случае count всегда <100, потому что массив не заполнен после того, как вы проверили это... так что единственное, что вам нужно сделать, это перемотать задний счетчик;
дополнительно удалить следует сделать front = (front+1)%100;
public int remove(){
if (isEmpty()){
return -1;
}
else{//else remove
int x = list[front];//reorder
front = (front+1)%100;//rewind
count--;
return x;
}
}
empty()
а также full()
следует использовать количество
front
указывает на элемент на remove()
следующий
last
всегда указывает на следующее свободное место (или на front
что является следующим свободным местом тоже)