0

Stack の実装が正しいかどうか教えてもらえますか?

   class LevelIter<Node> implements Iterable<Node> {
        Stack<Node> s = null;
        public LevelIter(Stack<Node> s) {
            this.s = s;
        }
        public Iterator<Node> iterator(){
            Iterator<Node> it = new Iterator<Node>() {
                private int index = 0;

                @Override
                public boolean hasNext(){
                        return (index < s.size() && !s.isEmpty());
                }

                @Override
                public Integer next(){
                    return (Integer) (s.pop()).data;
                }

                @Override
                public void remove(){
                    s.remove();
                }
            };
            return it;
        }
    }

Node はバイナリ ツリーのノードです。

  class Node{
    int data;
    Node left;
    Node right;
    public Node(int data){
        this.data = data;
        this.left = null;
        this.right = null;
    }
}

そして、私は主に次のように呼んでいます-

    LevelIter<Node> l = new LevelIter<Node>(s);
    for(int n:l){
        System.out.println(n);
    }
4

1 に答える 1

0

イテレータは、おそらく共有データ構造を変更すべきではありません。コンストラクターは、渡されたスタックをコピーして、そこから要素をポップしないようにする必要があります。

参照渡しと値渡しは、マスターするのが難しいテーマです。コード内の参照を実際にコピーしているので、LevelIter の Stack オブジェクトは、渡されたスタックと同じになります。これは、LevelIter を使用して反復すると、LevelIter が構築されたスタックが空になることを意味します。これはおそらく望ましくないため、次のことをお勧めします。

class LevelIter<Node> implements Iterable<Node> {
    Stack<Node> s = null;
    public LevelIter(Stack<Node> s) {
        this.s = (Stack)s.clone();
    }
    //rest is the same.
}

あなたのコードの残りの部分は私にはうまく見えます。ただし、コードが機能することを確認する最善の方法は、テストすることです。この反復子をテストするだけのクラスを作成します。期待どおりに機能することを確認してください。

于 2013-07-11T04:33:10.563 に答える