【问题标题】:Java Algorithms ResizingStringArrayQueue Resize Method ProblemsJava 算法 ResizedStringArrayQueue Resize 方法问题
【发布时间】:2020-05-10 07:11:42
【问题描述】:

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

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

所以就这样吧……

这是我对 ReizingStringArrayQueue 的实现:

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++];
    }

}

}

这是我的 Main() 的副本:

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。所以我认为问题出在我做事的顺序上,它最有可能在调整大小的方法中。我已经花了很长时间研究这个问题,现在我已经到了第二双眼睛真的很有帮助的阶段。提前感谢您的时间和耐心,我期待您的回音!

【问题讨论】:

  • 在我看来,tail 永远不会等于 a.length,因为数组的元素从 0 变为 a.lenght - 1。
  • 感谢您的回复 :) 如果您按照我期望的方式运行代码,队列确实会调整大小,这不是问题,问题是数组没有正确复制。当我加入“b”时,我的 String[] 已满并且看起来像 [a,b] 所以当我加入“c”时,它应该调整为 [a,b,null,null] 然后放入 c 以生成 [a ,b,c,null] 但由于某种原因我得到 [a,null,b,null]。复制出现问题。

标签: java algorithm implementation


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    • 1970-01-01
    • 2022-06-30
    • 1970-01-01
    相关资源
    最近更新 更多