Итак, я нахожусь в процессе изучения того, как использовать алгоритмы, и я использую Книгу Алгоритмов Роберта Седжвика, чтобы узнать, как это сделать, и вопрос - Упражнение 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. Поэтому я думаю, что проблема заключается в том, что я делаю что-то, а где-то, скорее всего, в методе изменения размера. Сейчас я долго смотрю на это и добираюсь до стадии, когда второй набор глаз был бы очень полезен. Спасибо за ваше время и терпение заранее, с нетерпением жду ответа от вас!