Stack类:
package com.javaeye.rsrt;
/**
* 栈,遵循先进后出的原则,用来保存元素
*
* @author nishiting
*
*/
public class Stack {
private int[] st;
private int top;
private int count;
/**
* 构造一个栈
*
* @param size
* 栈的大小
*/
public Stack(int size) {
st = new int[size];
top = -1;
count = 0;
}
/**
* 元素进栈
*
* @param j
* 要进栈的元素
*/
public void push(int j) {
count++;
st[++top] = j;
}
/**
* 元素出栈
*
* @return 出栈的元素
*/
public int pop() {
return st[top--];
}
/**
* 查询栈顶元素
*
* @return 栈顶元素
*/
public int peek() {
return st[top];
}
/**
* 查询栈是否为空
*
* @return 栈是否为空
*/
public boolean isEmpty() {
count--;
return (top == -1);
}
/**
* 查看栈里的所有元素
*/
public void list() {
for (int i = 0; i < count; i++) {
System.out.print(st[i] + " ");
}
System.out.println();
}
/**
* 得到栈里一共有多少元素
*
* @return 栈里的元素个数
*/
public int getCount() {
return count;
}
/**
* 查看栈里是否包含某个元素
*
* @param i
* 要查询的元素
* @return 是否包含了要查询的元素
*/
public boolean isContains(int i) {
for (int k = 0; k < st.length; k++) {
System.out.print("开始比较" + i + "此时的result:");
list();
System.out.println();
if (st[k] == i) {
return true;
}
}
return false;
}
/**
* 得到栈里的元素集
* @return 栈里的元素集合
*/
public int[] getSt(){
return st;
}
}
Graph类:
package com.javaeye.rsrt;
import java.util.Arrays;
import java.util.List;
import java.util.Vector;
/**
*
* @author nishiting
*
*/
public class Graph {
int vertexNum;
Vector[] vector;
Stack stack;
int[] result;
int[] in;// 入度
/**
*
* 构造一个图
*
* @param num
* 图的顶点数
*
*/
public Graph(int num) {
vertexNum = num;
vector = new Vector[vertexNum];
stack = new Stack(num);
result = new int[vertexNum];
in = new int[vertexNum];
}
/**
* 向图中添加无向边
*
* @param I
* 边的一个顶点
* @param J
* 边的另一个顶点
* @return 是否添加成功
*/
public boolean addEdge(int I, int J) {
/**
* 判断用户输入的是否是一个顶点,如果是,则返回flase,添加不成功
*/
if (J == I) {
return false;
}
/**
* 判断所输入的顶点值是否在图所顶点范围值内,如果不在,则提示顶点不存在
*
*/
if (I < vertexNum && J < vertexNum && I >= 0 && J >= 0) {
/**
*
* 判断边是否存在
*/
if (isEdgeExists(I, J)) {
return false;
}
/**
* 添加边,将孤头的入度加1
*/
vector[I].add(J);
in[J]++;
return true;
}
return false;
}
/**
* 判断有向边是否存在
*
* @param i
* 要查询的有向边的一个孤尾
* @param j
* 要查询的有向边的另一个孤头
* @return 边是否存在,false:不存在,true:存在
*/
public boolean isEdgeExists(int i, int j) {
/**
* 判断所输入的顶点值是否在图所顶点范围值内,如果不在,则提示顶点不存在
*
*/
if (i < vertexNum && j < vertexNum && i >= 0 && j >= 0) {
if (i == j) {
return false;
}
/**
* 判断i的邻接结点集是否为空
*/
if (vector[i] == null) {
vector[i] = new Vector(8);
}
/**
* 判断这条边是否存在,如果存在,则提示边已经存在
*/
for (int q = 0; q < vector[i].size(); q++) {
if (((Integer) vector[i].get(q)).intValue() == j) {
System.out.println("顶点" + i + "和" + "顶点" + j + "这两点之间存在边");
return true;
}
}
}
return false;
}
public void TopSort() {
for (int i = 0; i < vertexNum; i++)
if (in[i] == 0)
stack.push(i);
int k = 0;
while (!stack.isEmpty()) {
result[k] = (Integer) stack.pop();
if (vector[result[k]] != null) {
for (int j = 0; j < vector[result[k]].size(); j++) {
int temp = (Integer) vector[result[k]].get(j);
if (--in[temp] == 0) {
stack.push(temp);
}
}
}
k++;
}
if (k < vertexNum) {
System.out.println("有回路");
System.exit(0);
}
}
public int[] getResult() {
return result;
}
}
测试类:
package com.javaeye.rsrt;
import java.util.List;
import junit.framework.TestCase;
public class GraphTest extends TestCase {
public void testGraph(){
Graph graph = new Graph(6);
graph.addEdge(1, 0);
graph.addEdge(2, 0);
graph.addEdge(3, 0);
graph.addEdge(1, 3);
graph.addEdge(2, 3);
graph.addEdge(3, 5);
graph.addEdge(4, 2);
graph.addEdge(4, 3);
graph.addEdge(4, 5);
graph.TopSort();
int[] list = graph.getResult();
System.out.println("拓扑排序的结果为:");
for(int i : list){
System.out.print(i+" ");
}
}
}