Как исправить исключение ArrayIndexOutOfBounds: -1 в ArrayDeque - PullRequest
0 голосов
/ 07 октября 2018

Я получаю сообщение об ошибке:

java.lang.ArrayIndexOutOfBoundsException: -1

, и это относится к методу ввода:

deque[back] = x;

У меня также есть методы для push и pop, которые добавляют и удаляют элементы спередино они работают нормально.

Идея состоит в том, чтобы использовать реализацию на основе массива в качестве deque, где вставлять и извлекать вставлять элемент сзади и удалять элемент сзади.

  public void inject(int x){

        if (elementCount == size){

            System.out.println("The Deque is Full");
        } else {



            deque[back] = x;            
            back = (back - 1) % size;            
            elementCount ++;

        }

    }

    public class Deque {

    int[] deque;
    int front;
    int back;
    int size;
    int elementCount;

  public Deque(int s){

           size = s;
           deque = new int[size];

           front = 1;
           back = 0;        
           elementCount = 0; //n of elements

     }

    public int getRear(){

        return deque[back];
    }   

    public int getFront(){

        return deque[front];

    }


 public void inject(int x){

            if (elementCount == size){

                System.out.println("The Deque is Full");
            } else {

                deque[back] = x;            
                back = (back - 1) % size;            
                elementCount ++;

     }

  }

   public void eject(){

            if (elementCount == 0){

                System.out.println("The deque is empty");

            }else{

                back = (back + 1) % size;
                elementCount--;
        }

    }

 }

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Первое, что я заметил, вы используете слишком много переменных для этой проблемы.Если вы сломаете его, вам нужно только 3 переменные.массив, размер массива и текущее местоположение в массиве для вставки и извлечения.Это порядок LiFo (последний пришел первым вышел).

public void inject(int x){

    if (this.deque.size() == this.size){ //check for full array

        System.out.println("The Deque is Full");
    } else {



        this.deque[this.back+1] = x;  //input new item next slot            
        this.back ++; //increment back to new input where eject would pull from           
        }

}

public class Deque {

int[] deque;
int back;
int size;

public Deque(int s){

       this.size = s;
       this.deque = new int[size];

       this.back = 0;        
 }

это также должно решить проблему с индексом вашего массива. Я не уверен, почему вы использовали функцию Modulo '%' для текущего местоположения спины.

0 голосов
/ 07 октября 2018

У вас есть несколько мест:

back = (back - 1) % size;

Это не работает так, как вы думаете, когда back изначально 0, где оно становится -1 % size, обычно -1.В местах, где он появляется, вы должны вместо этого использовать:

back = (size + back - 1) % size;
...