我希望在数据结构上有一个迭代器。 现在我不知道什么是数据结构,可能它是一个DAG(有向无环图),但也许它也可能是一个链表。 所以我想把它包装成一个迭代器,现在不要考虑特定的数据结构。
我知道如何使用类似递归的访问者访问DAG,
但我无法找到一个简单而干净的结构来实现迭代器方法next()
和hasNext()
。
在迭代器中,我创建了一个当前节点实例,并在所有子节点上使用for循环进行迭代,然后返回到父节点。需要一个“已经访问过”的标志。
所以我的DagElement
有更多属性:
DagElement parent
boolean alreadyVisited
我认为这不是一个干净的解决方案。
有什么建议吗?
答案 0 :(得分:1)
将递归启发式转换为迭代启发式的快速方法是使用(LIFO)堆栈或(LILO)队列来保存“未采取的道路” - 找到但尚未采用的路径。在这种情况下,迭代器将具有堆栈或队列实例变量。类似的东西:
class DagIterator<T>
extends Iterator<T> {
private Stack<DagNode<T>> nodes;
private DagIterator(Dag<T> dag) {
nodes.push(dag.getRootNode());
}
public boolean hasNext() {
return ! nodes.isEmpty();
}
public T next() {
final DagNode node = nodes.pop();
for (final DagNode child : node.getChildren()) {
nodes.push(child);
}
return node.getValue();
}
}
您可以根据数据结构(LIFO或LILO),子项排队的顺序以及排队时间来调整访问顺序。一些访问命令可能需要立即以正确的顺序排队整个节点集(在构造函数中),这并不令我感到惊讶。