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

来源:互联网 发布:淘宝网能卖军用品 编辑:程序博客网 时间:2024/05/28 14:56

这两天遇到一个关于图的算法,在网上找了很久没有找到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); //ABtheGraph.addEdge(1, 2); //BCtheGraph.addEdge(0, 3); //ADtheGraph.addEdge(3, 4); //DEtheGraph.addEdge(2, 4); //CESystem.out.print("The order visited:");theGraph.dfs();System.out.println();}}}
程序运行的结果:

The order visited:ABCED

1 0