您的位置:首页 > 编程语言 > Java开发

java版的无向图结构的存储及DFS操作

2015-11-08 10:40 459 查看
这两天遇到一个关于图的算法,在网上找了很久没有找到java版的关于数据结构中图的存储及其相关操作。于是找了一本java版的数据结构书看了一下,以下是根据书上的讲解整理的一个关于无向图的存储和对图的深度优先遍历。不过这个遍历只能遍历连通图,要想遍历非连通图,还需要修改。在这里分享一下代码希望对有需要的人有帮助。

package com.homework;

/**
* 定义栈类
*/
class StackX{
private final int size = 20;
private int[] st;
private int top;
//初始化栈
public StackX(){
st = new int[size];
top = -1;
}
//进栈
public void push(int j){
st[++top] = j;
}
//出栈
public int pop(){
return st[top--];
}
//返回栈顶元素
public int peak(){
return st[top];
}
//判断栈是否为空
public boolean isEmpty(){
return (top==-1);
}
}
/**
* 定义图中的节点类
* @author Administrator
*
*/
class Vertex{
public char label;
public boolean wasVisited;

public Vertex(char lab){
label = lab;
wasVisited = false;
}
}
/**
* 定义图类
* @author Administrator
*
*/
class Graph{

private final int num = 20;
private Vertex vertexList[];//图中节点数组
private int adjMat[][];//节点矩阵
private int nVerts; //当前节点数
private StackX theStack;//定义一个栈

//初始化图的结构
public Graph(){
vertexList = new Vertex[num];
adjMat = new int[num][num];
nVerts = 0;

for(int i=0; i<num; i++){
for(int j=0; j<num; j++)
adjMat[i][j] = 0;
}
}
//添加节点
public void addVertex(char lab){
vertexList[nVerts++] = new Vertex(lab);
}
//添加某两个节点之间的边
public void addEdge(int start,int end){
adjMat[start][end] = 1;
adjMat[end][start] = 1;
}
//输出某个节点
public void displayVertex(int v){
System.out.print(vertexList[v].label);
}
//获取未被访问的几点
public int getAdjUnvisitedVertex(int v){
for(int j=0; j<nVerts; j++){
if(adjMat[v][j]==1 && vertexList[j].wasVisited==false)
return j;
}
return -1;
}
//深度优先遍历(DFS)
public void dfs(){
vertexList[0].wasVisited=true;
displayVertex(0);
theStack= new StackX();
theStack.push(0);

while(!theStack.isEmpty()){
int v = getAdjUnvisitedVertex(theStack.peak());
if(v==-1)//若不存在该节点
theStack.pop();
else
{
vertexList[v].wasVisited = true;
displayVertex(v);
theStack.push(v);
}
}
for(int j=0; j<nVerts; j++)
vertexList[j].wasVisited = false;
}
}
public class GraphConnect {
public static void main(String[] args){
{
Graph theGraph = new Graph();
theGraph.addVertex('A');
theGraph.addVertex('B');
theGraph.addVertex('C');
theGraph.addVertex('D');
theGraph.addVertex('E');

theGraph.addEdge(0, 1); //AB
theGraph.addEdge(1, 2); //BC
theGraph.addEdge(0, 3); //AD
theGraph.addEdge(3, 4); //DE
theGraph.addEdge(2, 4); //CE

System.out.print("The order visited:");
theGraph.dfs();
System.out.println();
}

}
}
程序运行的结果:

The order visited:ABCED
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: