Java 算法 ResizeStringArrayQueue Resize Method 问题



所以我正在学习如何使用算法,我正在使用Robert Sedgewick的算法书来学习如何做到这一点,问题是练习1.3.14(如果你想学习这些东西,我会强烈推荐。无论如何,我正在尝试为我的 RessizeStringArrayQueue 实现我自己的调整大小算法,我真的很难让我的实现工作。但在我进一步深入研究之前,我想礼貌地问一下,我不是在寻找调整数组大小的完整解决方案(我正在尝试学习,所以需要自己做这件事。但是,如果有人能够向我解释为什么我的调整大小方法无法将自身复制到新的更大的数组中,我们将不胜感激。

我想在这里强调的是,我专注于 enque 方法,现阶段没有研究 deque,所以请不要解决 deque 的工作原理,谢谢!

所以在这里...

这是我对 RessizeStringArrayQueue 的实现:

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();
}

如果你注释掉 c、d 和 e 的"enques",代码会在你运行它时做它应该做的事情,我会得到一个完整的队列 [a,b]。但是,当我到达 c 时,我的队列变为 [a,null,c, null],而它应该是 [a,b,c,null],由于某种原因它无法复制 b。所以我认为问题在于我做事的顺序,它最有可能在调整大小方法的某个地方。我现在花了很长时间研究这个问题,我正在进入第二双眼睛会非常有帮助的阶段。提前感谢您的时间和耐心,期待您的来信!

在调整大小时,将语句 a = temp 移出 for 循环。

相关内容

最新更新