拓扑排序的时候,需要记录当前访问的点,是从哪个父节点下来的。所以我们增加了一个叫head的栈,用来记录这个信息——当两个栈(frontier和head)的peek元素相同时,就意味着,父节点下面已经没有节点可以继续访问了,此时相当于一层递归的DFS结束。

需要留意的是,同一个节点可能来自不同的父节点:比如有两条边3 → 2和5 → 2。那么节点2可能有两次push进frontier,所以在处理的时候需要留意节点的状态。显而易见地,如果某一个节点已经被标记了拓扑顺序,那么它就不应该再次被标记,也就是说,它就不应该再次进入head栈。