有人可以告诉我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);
}
答案 0 :(得分: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.
}
您的其余代码对我来说很好。确保代码正常工作的最佳方法是测试它。创建一个只测试这个迭代器的类。确保其功能符合您的预期。