Первый подход совсем не DFS, по крайней мере, в каноническом определении алгоритма DFS. Это просто BFS, в которой кто-то заменил очередь на стек. Однако эта реализация достаточно хороша для «имитации» DFS в том смысле, что она обнаруживает вершины графа в DFS-подобном порядке. Его можно назвать «псевдо-DFS», если хотите, из-за порядка обнаружения, подобного DFS, но канонический алгоритм DFS намного больше этого.
Каноническая DFS не только следует за порядком обнаружения вершин в глубину, но также создает определенный порядок «обнаружения», определенный возвратный порядок (т. Е. Момент, когда «серая» вершина становится «черной») вершина в классической номенклатуре Дейкстры). В первой реализации эта важная особенность канонической DFS отсутствует (или ее невозможно реализовать каким-либо разумным способом).
Между тем, второй подход является явно рекурсивной реализацией классического алгоритма DFS.
В любом случае, в реальном DFS или псевдо-DFS не существует «одного истинного порядка», в котором следует посещать вершины. Обе реализации могут быть созданы для создания одного и того же порядка посещения вершин. В вашем случае никто просто не удосужился это сделать. Разница в выводе обусловлена тем фактом, что прежняя реализация посещает соседей в обратном порядке - от последнего к первому. Все соседи сначала помещаются в стек, а затем выталкиваются один за другим в целях посещения. Поведение стека в LIFO - это то, что вызывает обращение. Между тем последняя реализация посещает соседей в порядке forward - от первого до последнего.
Если вы замените цикл в последней реализации на
for (int i = neighbours.size() - 1; i >= 0; --i)
вы должны получить одинаковый порядок посещения (одинаковый вывод) в обеих реализациях.