я изначально имел рекурсивное решение для топологической сортировки:Топологическая сортировка с использованием Итерация вместо рекурсии
void dfs(int v, bool visited[], node* adjList[], std::stack<int> &myStack) {
visited[v] = true;
node* curr = adjList[v];
while (curr != NULL) {
if(!visited[curr->val]) {
dfs(curr->val, visited, adjList, myStack);
}
curr = curr->next;
}
myStack.push(v);
}
и, казалось, работать для моих целей. Но мне сложно перевести его в итерационное решение. Это моя попытка:
void dfs(int v, bool visited[], node* adjList[], std::stack<int> &myStack) {
std::stack<int> recursion;
visited[v] = true;
recursion.push(v);
while(!recursion.empty()) {
v = recursion.top();
recursion.pop();
node* curr = adjList[v];
myStack.push(v);
while (curr != NULL) {
if(!visited[curr->val]) {
visited[curr->val] = true;
recursion.push(curr->val);
}
curr = curr->next;
}
}
}
Но заказ полностью испорчен! Я думаю, что это может быть связано с позиционированием моего myStack.push(v)
, но я не знаю, как подойти к этому. Любая помощь была бы оценена.
В последние пару дней я думал, что обычно это трюк, чтобы инвертировать условие выхода из рекурсии и использовать его для условия отсутствия нерекурсивной функции. Затем, я теоретизирую, вы можете сохранить большую часть своей старой логики. – BitTickler
@BitTickler Что вы подразумеваете под этим? – Jon
Главное отличие состоит в том, что в рекурсии у вас разные состояния 'visit', в то время как в итеративной версии вы изменяете только один такой список, и вы отменяете' посещение' при обратном трассировке. – SpamBot