写出用栈的拓扑排序
时间: 2023-07-03 21:05:34 浏览: 51
拓扑排序是对有向无环图(DAG)进行排序的一种算法,可以用栈来实现。
具体实现步骤如下:
1. 统计每个顶点的入度(即有多少条边指向该顶点),并将入度为0的顶点入栈。
2. 当栈不为空时,依次弹出栈顶元素,并将其所有邻接点的入度减1。
3. 如果邻接点的入度减为0,则将其入栈。
4. 重复步骤2和步骤3,直到栈为空。
5. 如果排序后的元素个数小于图中的顶点数,则说明图中存在环,无法进行拓扑排序。
下面是用栈实现拓扑排序的Python代码示例:
```python
def topo_sort(graph):
# 统计每个顶点的入度
indegrees = {v: 0 for v in graph}
for v in graph:
for w in graph[v]:
indegrees[w] += 1
# 将入度为0的顶点入栈
stack = [v for v in indegrees if indegrees[v] == 0]
# 拓扑排序
sorted_vertices = []
while stack:
v = stack.pop()
sorted_vertices.append(v)
for w in graph[v]:
indegrees[w] -= 1
if indegrees[w] == 0:
stack.append(w)
# 如果排序后的元素个数小于图中的顶点数,则说明图中存在环,无法进行拓扑排序
if len(sorted_vertices) < len(graph):
raise ValueError("Graph contains a cycle")
return sorted_vertices
```
其中,`graph`表示图的邻接表表示,字典类型,键为顶点,值为一个列表,表示从该顶点出发的所有边指向的顶点。函数返回拓扑排序后的顶点列表。