[模板]人工栈

用于没用

//一般DFS
void dfs(int x){

    (A) ;    //该节点遍历前

    for(int i=head[x];i;i=edge[i].next){
        if( (B) ){    //判断合法性
            
            (C);    //下一节点入栈

            dfs(edge[i].to);

            (D);    //下一节点退出
        }
    }

    (E);    //该节点遍历完成
}
dfs(s);

//等价于

//人工栈DFS
int st[N],tpi[N],size;
void dfs(int s){
    for(st[size=1]=s;size;){
        int x=st[size],&i=tpi[x];
        if(!i){
            
            (A);    //该节点遍历前
            
            i=head[x];
        }else{

            (D);    //下一节点退出

            i=edge[i].next;
        }
        for(;i&& (B) ;i=edge[i].next);   //判断合法性
        if(i){
            
            (C);    //下一节点入栈
            
            st[++size]=edge[i].to;
        }else{
            
            (E);    //该节点遍历完成
            
            --size;
        }
    }
}
dfs(s);

upd2021/2/3:因为年久失修,所以修正了一下。
upd2021/2/27:将变量名换成了更喜闻乐见的形式。

原文地址:https://www.cnblogs.com/groundwater/p/13476284.html