Java Алгоритмы ResizingStringArrayQueue Проблемы метода изменения размера - PullRequest
0 голосов
/ 24 января 2020

Итак, я нахожусь в процессе изучения того, как использовать алгоритмы, и я использую Книгу Алгоритмов Роберта Седжвика, чтобы узнать, как это сделать, и вопрос - Упражнение 1.3.14 (я очень рекомендую, если вы хотите чтобы изучить этот материал.) В любом случае, я пытаюсь реализовать свой собственный алгоритм изменения размера для моего ResizingStringArrayQueue, и я действительно изо всех сил пытаюсь заставить мою реализацию работать. Но прежде чем углубляться в это, я хотел бы вежливо спросить, что я НЕ ищу полного решения для моего массива изменения размера (я пытаюсь учиться, поэтому нужно сделать это самостоятельно.) Однако, если кто-то сможет объясните мне, почему мой метод изменения размера не может скопировать себя в новый больший массив, любая помощь, которая может быть предложена, будет принята с благодарностью.

Я хотел бы подчеркнуть здесь, что я сосредоточен на методе enque, и на данном этапе не работаю над deque, поэтому, пожалуйста, нет решения, как работает deque, спасибо!

Итак, пошли ...

Это моя реализация ResizingStringArrayQueue:

import java.util.Iterator;

public class ResizingArrayQueueOfStrings implements Iterable<String> {

private String[] a = new String[1]; 
private int n; 
private int head;
private int tail; 

public boolean isEmpty() { return n==0; } 
public int size() {return n; }


public void aPrint() { // temporary method for testing needs deleting
    System.out.println("Contents of array: ");
    for (int i = 0; i < a.length; i++) {

        System.out.print(a[i]+ " ");
    } 
}   

private void resize(int max) {  
    String[] temp = new String[max];
    for (int i = head; i < tail; i++) {
        temp[i] = a[i]; 
        a = temp;
    }
}

public void enque(String item) { // something is in the wrong order here

    if (tail == a.length) {
        System.out.println("Capacity Doubled");
        resize(2*a.length);
    }
    n++;
    a[tail++] = item;
}

public String deque() {
    if (head == tail/2) {
        resize(n);
        head = 0;
        tail = n;
    }

    n--;
    String item = a[head];
    a[head++] = null; // loitering
    return item;
}

public Iterator<String> iterator(){
    return new ResizingArrayQueueIterator();
}

private class ResizingArrayQueueIterator implements Iterator<String>{

    private int i = head;


    @Override
    public boolean hasNext() {

        return i < tail; 
    }

    @Override
    public String next() {
        // TODO Auto-generated method stub
        return a[i++];
    }

}

}

И это копия моего основного ():

public static void main(String[] args) {
    // TODO Auto-generated method stub

    // EXERCISE 1.3.14
    System.out.println("EXERCISE 1.3.14 ");
    System.out.println();
    ResizingArrayQueueOfStrings queueOfStrings = new ResizingArrayQueueOfStrings();
    queueOfStrings.enque("a");
    queueOfStrings.enque("b");
    queueOfStrings.enque("c");
    queueOfStrings.enque("d");
    queueOfStrings.enque("e");

    System.out.println();       

    for (String string : queueOfStrings) {
        System.out.println(string);         
    }

    System.out.println();       
    queueOfStrings.aPrint();

}

Если вы закомментируете «enques» для c, d и e, код делает то, что должен, если вы запускаете его, я получаю полную очередь [a, b]. Однако, когда я добираюсь до c, моя очередь становится [a, null, c, null], когда она должна быть [a, b, c, null], по какой-то причине не удается скопировать b. Поэтому я думаю, что проблема заключается в том, что я делаю что-то, а где-то, скорее всего, в методе изменения размера. Сейчас я долго смотрю на это и добираюсь до стадии, когда второй набор глаз был бы очень полезен. Спасибо за ваше время и терпение заранее, с нетерпением жду ответа от вас!

1 Ответ

0 голосов
/ 24 января 2020

При изменении размера выведите оператор a = temp из для l oop.

...