Случай вставки массива в кольцевую очередь

У меня есть код для реализации этого довольно близко к завершению, что вызывает мою ошибку 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 что является следующим свободным местом тоже)

Другие вопросы по тегам