设一个有向图采用邻接表存储结构,边结点类定义如下 public class Edge | public int adj: /邻接点在顶点表中的下标 李美娜 7413322093 public Edge next: 74133220935 顶点结点类定义如下 public class Vex ( public Object data; 试时间:2023-05-22 15:00至 public Edge first: 023-05-28 23:00 图的类定义为: 33220935 public class Graph ( private VexD vex; //顶点表 private int vn: /顶点个数 注:初始化空栈用new Stack(0,顶点序号v入栈用Stack中的push(√)方法 法,返回值为出栈的顶点序号,判断栈是否为空用Stack中的isEmpty0方法。 出栈Stack中的pop0方 值)写入数组,两数返回值为true表示成功,为false表示存在环。 用Java编写拓扑排序函数booleean toposort(Object a)如下,其中排序结果顶点的Jdata域的
时间: 2023-11-27 20:54:41 浏览: 75
值写入数组result中,函数返回值为true表示拓扑排序成功,为false表示存在环:
```
public boolean toposort(Object a) {
int[] indegrees = new int[vn]; //记录每个顶点的入度
Stack<Integer> stack = new Stack<>(0); //用于存放入度为0的顶点
int count = 0; //计数器,记录已经排序的顶点个数
VexD target = null;
for (int i = 0; i < vn; i++) {
if (vex[i].data.equals(a)) { //找到目标顶点
target = vex[i];
}
Edge e = vex[i].first;
while (e != null) {
indegrees[e.adj]++;
e = e.next;
}
}
if (target == null) { //目标顶点不存在
return false;
}
for (int i = 0; i < vn; i++) {
if (indegrees[i] == 0) { //将入度为0的顶点入栈
stack.push(i);
}
}
while (!stack.isEmpty()) {
int v = stack.pop();
result[count++] = vex[v].data; //将已经排序的顶点的data域写入数组
Edge e = vex[v].first;
while (e != null) {
indegrees[e.adj]--; //将所有邻接点的入度减1
if (indegrees[e.adj] == 0) { //如果邻接点的入度变为0,则入栈
stack.push(e.adj);
}
e = e.next;
}
}
return count == vn; //如果计数器等于顶点个数,表示拓扑排序成功
}
```
阅读全文