В вашем коде есть пара проблем, одна из которых заключается в том, что вы делаете int vertex = s.pop();
, а затем s.push(vertex);
с той же вершиной.Последнее должно быть, вероятно, s.push(i);
.
Самый простой способ реализовать обход DF - просто использовать рекурсию.Затем код уменьшается до
function dfs(v) {
if v not visited before {
mark v as visited;
for every adjacent vertex a of v do {
dfs(a);
}
do something with v; // this is *after* all descendants have been visited.
}
}
Конечно, каждая рекурсивная реализация может быть эквивалентно реализована с использованием стека и итерации, но в вашем случае это будет несколько сложнее, поскольку вам придется не толькосохранить текущую вершину в стеке, а также состояние итерации по ее потомкам (переменная цикла i
в вашем случае).