Отключение в Java с использованием массивов + нечетных и четных чисел - PullRequest
0 голосов
/ 03 мая 2018

У меня возникли проблемы с программированием, в котором я должен реализовывать очереди с использованием массивов.

У меня уже есть нужные мне операции, но после реализации вам нужно пробежаться по номерам 1-20 и вставить четные числа в конец очереди, а нечетные числа добавить начало.

После этого вы должны использовать метод removeFront , чтобы удалить все числа в списке и распечатать их на консоли.

Существует также намек на то, что правильный вывод: (19,17,15 ..., 1,2,4, ..., 20).

Моя проблема сейчас в том, что в списке отсутствует номер 1, и вместо этого он выводит нулевое значение в качестве первого удаляемого элемента.

public class Dequeues<E> {

private final int max;
private int head;
private int tail;
private E[] deque;
private int counter;

public Dequeues(int max) {
    this.max = max;
    deque = (E[]) new Object[max];
    this.head = 0;
    this.tail = 0;
    this.counter = 0;
}

public boolean isEmpty (){
    return (counter == 0);
}

public boolean isFull() {
    return(counter>= max);
}

public void addFront (E x){
    if(!isFull()) {
        if (head == 0) {
            head = deque.length-1;
            deque[head] = x;
        } else {
            deque[head--] = x;
        }
        counter++;
    }
    else throw new IndexOutOfBoundsException("Stack is full!");
}

public void addBack(E x){
    if(!isFull()) {
        if(tail == deque.length-1) {
            tail = 0;
            deque[tail] = x;
        } else {
            deque[tail++] = x;
        }
        counter++;
    }
    else throw new IndexOutOfBoundsException("Stack is full!");
}

public E removeFront(){
    if(!isEmpty()) {
        E ret = deque[head];
        deque[head++] = null;
        if(head >= deque.length) {
            head = 0;
        }
        counter--;
        return ret;
    }
    else throw new IndexOutOfBoundsException("Stack is empty");
}

public E removeBack(){
    if (!isEmpty()) { 
        E ret = deque[tail]; 
        deque[tail--] = null;
        if(tail < 0) {
            tail = deque.length-1;
        }
        counter--;
        return ret;
        }
    else throw new IndexOutOfBoundsException("Stack is empty");
}


public static void main (String [] args) {
Dequeues test = new Dequeues(20);
for (int i = 1; i <= test.deque.length; i++) {
    if(i % 2 == 0) {
        test.addBack(i);
    } else if(i % 2 == 1) {
        test.addFront(i);
    }
}

System.out.println("Use of removeFront and output of the values: ");
for (int i = 0; i < test.deque.length; i++) {       
    System.out.print(test.removeFront() + " ");
    }   
}}

Вывод следующий:

Использование removeFront и вывод значений: null 19 17 15 13 11 9 7 5 3 2 4 6 8 10 12 14 16 18 20

1 Ответ

0 голосов
/ 03 мая 2018

Вы просто неправильно использовали оператор. Правильная реализация метода addFront должна быть:

public void addFront (E x){
    if(!isFull()) {
        if (head == 0) {
            head = deque.length-1;
            deque[head] = x;
        } else {
            deque[--head] = x;
        }
        counter++;
    }
    else throw new IndexOutOfBoundsException("Stack is full!");
}

Итак, разница здесь deque [- head] = x ;

- голова означает уменьшить значение головы на единицу, а затем использовать его.

head-- означает использовать значение head и затем уменьшить его значение

Ваша ситуация была:

  1. head = deque.length-1; голова == 19

  2. head! = 0 и вы переходите к оператору else. head value = 19. Вы использовали head-- и получили снова 19 и уменьшили его на единицу, но должны были использовать --head.

...