我一直在尝试使用面向对象的设计并通过实现DFS
类来简化Iterator
。但是DFS
不能正常工作。
我几乎已经尝试了所有可能的方法,但是我无法完成这项工作。
我也找不到关于我正在尝试的代码类型的很多相关信息。
我有两个接口Vertex
和Graph
。
以下是我正在尝试的代码:
public class GraphIterator implements Iterator<Vertex> {
private Graph g;
private Vertex v;
private Stack<Vertex> stack;
private Set<Vertex> colored;
public GraphIterator(Graph g, Vertex v) {
this.g = g;
this.v = v;
stack = new Stack<>();
colored = new TreeSet<>();
stack.push(v);
colored.add(v);
}
@Override
public boolean hasNext() {
return stack.isEmpty();
}
@Override
public Vertex next() {
Vertex u = stack.pop();
for(Vertex vertex : g.getNeighbours(u)) {
if(vertex != null && !colored.contains(vertex))
stack.add(vertex);
}
return stack.pop();
}
}
这是我尝试测试的main()
中的代码:
GraphClass g = new GraphClass();
Vertex v = new VertexClass(0);
Vertex w = new VertexClass(1);
g.addVertex(v);
g.addVertex(w);
g.addEdge(v, w);
Iterator<Vertex> it = new GraphIterator(g, v);
System.out.println(v+" vs "+it.next());
System.out.println(it.hasNext());
System.out.println(w+" vs "+it.next());
我知道我在DFS
算法上做错了什么,但是我无法完全理解我在哪里以及哪里出错了?
我基本上可以确定我在DFS
算法上做错了,该算法需要使用Iterator
类中的重写方法来实现。我也希望能了解一些这样做的技巧。
如果有人可以帮助我解决这个问题,我将不胜感激。
答案 0 :(得分:1)
可能对相关代码进行了改进:
next()
中,可能只是return u;
,而不是return stack.pop();
。next()
中弹出2个元素,并且未选中第二个元素的相邻顶点。LinkedList
比这里的Stack
更好。顺便说一句:
LinkedList
也是 stack ,它不是线程安全的;而Stack
是线程安全的。