java版的无向图结构的存储及DFS操作
2015-11-08 10:40
459 查看
这两天遇到一个关于图的算法,在网上找了很久没有找到java版的关于数据结构中图的存储及其相关操作。于是找了一本java版的数据结构书看了一下,以下是根据书上的讲解整理的一个关于无向图的存储和对图的深度优先遍历。不过这个遍历只能遍历连通图,要想遍历非连通图,还需要修改。在这里分享一下代码希望对有需要的人有帮助。
The order visited:ABCED
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
相关文章推荐
- java接口与继承
- Struts2表单提交的中文字符数据用hibernate存储在数据库中是乱码的问题。
- 多线程
- java类修饰符
- Spring+SpringMVC+MyBatis整合教程
- Spring配置文件的使用
- Java消息服务(JMS)学习小结
- JDK DualPivotQuicksort 源码解析
- Java解析HTML之HTMLParser使用与详解
- Java理论学时第六节。课后作业。
- 基于Struts2.3.x+Spring3.2.x+Hibernate4.2.x+EasyUI1.3.4+Maven架构的示例程序
- java web开发的标签库
- [CareerCup] 14.2 Try-catch-finally Java中的异常处理
- Java并发编程:Lock
- 简单谈谈java中匿名内部类构造函数
- Java并发编程:synchronized
- Java volatile&synchronized
- Java基础之思维导图2
- Java基础之思维导图1
- Java作业1