我遇到错误:
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--;
}
}
}
答案 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函数'%'。