Вот псевдокод топологической сортировки из Википедии:
L ← Empty list that will contain the sorted nodes
while there are unmarked nodes do
select an unmarked node n
visit(n)
function visit(node n)
if n has a temporary mark then stop (not a DAG)
if n is not marked (i.e. has not been visited yet) then
mark n temporarily
for each node m with an edge from n to m do
visit(m)
mark n permanently
unmark n temporarily
add n to head of L
Я хочу написать это нерекурсивно, не теряя обнаружения циклов.
Проблема в том, что я не знаю, как это сделать, и я уже придумал много подходов. В основном проблема заключается в том, чтобы сделать DFS, но с запоминанием «текущего пути» (он соответствует «временной маркировке» определенных узлов в псевдокоде выше). Таким образом, традиционный подход со стеком ничего мне не дает, потому что при использовании стека (и размещении в нем соседей каждого узла) я помещаю туда узлы, хотя я увижу их «в неопределенном будущем», и я хочу только отслеживать узлы "на моем текущем пути" (я вижу это как прохождение лабиринта с нитью, которую я оставляю позади себя - когда я вижу тупик, я поворачиваюсь назад и "оборачиваю гусеницу" при этом и в любой момент в время я хочу запомнить узлы "с лежащей на них нитью" и узлы, на которых нить была хотя бы один раз). Любые советы, которые укажут мне в правильном направлении? Я имею в виду - должен ли я думать об использовании 2 стеков вместо 1, может быть, какой-то другой структуры данных?
Или, может быть, этот алгоритм в порядке, и я должен оставить его в рекурсивной форме. Меня беспокоит только превышение «глубины рекурсии» для достаточно больших графов.