如何修复ArrayIndexOutOfBounds异常:ArrayDeque中为-1

时间:2018-10-07 15:52:51

标签: java arraydeque

我遇到错误:

java.lang.ArrayIndexOutOfBoundsException: -1

指的是方法注入:

deque[back] = x;

我也有用于推送和弹出的方法,这些方法可以在前面添加和删除项目,但是可以正常工作。

这个想法是使用基于数组的实现作为双端队列,其中在后面插入和弹出插入项,在后面插入和删除项。

  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 :(得分:0)

您有多个位置:

back = (back - 1) % size;

这与您认为back最初为0并变为-1 % size(通常为-1)时不一样。在显示的地方,您应该使用:

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

答案 1 :(得分:-1)

我注意到的第一件事是您为此问题使用了太多的变量。如果将其分解,则只需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;        
 }

这也应该解决您的数组索引问题,我不确定您为什么对当前的back位置使用Modulo函数'%'。