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 回答