Реализация очереди, ошибка метода peek()

#java #package

Вопрос:

Вот мой код для реализации Queue . Во время выполнения кода возникает проблема, в методе отображается ошибка во время выполнения peek() .

 public class Queue {
int size;
int frontIndex;
int backIndex;
int arr[];

Queue()
{
 size = 5;
 frontIndex =-1;
 backIndex = -1;
 arr = new int[size];
}
public int peek() {
return arr[frontIndex];
}
 public void enqueue(int data)
{
    if(isFull())
    {
    System.out.println("Queue is overflow");
    }
    else
    {   
    System.out.println("Insert "   data);
    backIndex   ;
    arr[backIndex]=data; 
    }
 }
 public static void main(String[] args) {
    Queue queue = new Queue();  
    queue.enqueue(15);
    queue.enqueue(18);      
 System.out.println("Front element of queue is "   queue.peek()); 
  } 
 }
 

Это ошибка, которую я получаю:

 "Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 5 "
 

Комментарии:

1. Вы увеличиваете backIndex , когда ставите элемент в очередь, НО в peek методе, к которому вы обращаетесь frontIndex , значение равно -1, следовательно, исключение за пределами. Вы забыли обновить frontIndex внутри enqueue метода.

2.Вы frontIndex начинаете с -1 и peek пытаетесь получить доступ к массиву по этому индексу. Так что, вполне ожидаемо. Почему вы этого не ожидаете?

3. @Fildor да ,вы правы ,я понял, где совершил ошибку. Спасибо за поддержку.

4. Добро пожаловать в SO. Пожалуйста, сделайте отступ в своем коде. Правильный отступ не является необязательным, но необходим для удобства чтения. Когда вы публикуете на SO, пожалуйста, сделайте так, чтобы людям было как можно проще вам помочь. Спасибо!

Ответ №1:

Вы никогда не обновляете свой frontIndex .

Что вы могли бы сделать, так это:

Установите frontIndex значение 0 вместо -1, чтобы это peek() не создавало исключения до того, как вы получите первый элемент из очереди. Я предполагаю, что причина инициализации его с помощью -1 заключалась в том, что вы увеличивали бы его, прежде чем получать элемент из очереди. Это проблематично, когда вы пытаетесь peek() войти в очередь перед доступом к ее первому элементу.

Обходной путь состоит в том, чтобы просто инициализировать frontIndex значение 0, а затем увеличить его после того, как вы получите значение из очереди.

Если peek() предполагается фактически вывести значение из очереди, простое увеличение frontIndex в peek методе:

 public int peek() {
    frontIndex  ;
    return arr[frontIndex];
}