java编程无向图结构的存储及DFS操作代码详解

 更新时间:2017年12月08日 10:20:59   作者:Sober_123  
这篇文章主要介绍了java编程无向图结构的存储及DFS操作代码详解,具有一定借鉴价值,需要的朋友可以了解下。

图的概念

图是算法中是树的拓展,树是从上向下的数据结构,结点都有一个父结点(根结点除外),从上向下排列。而图没有了父子结点的概念,图中的结点都是平等关系,结果更加复杂。

无向图                                                       有向图

图G=(V,E),其中V代表顶点Vertex,E代表边edge,一条边就是一个定点对(u,v),其中(u,v)∈V。

这两天遇到一个关于图的算法,在网上找了很久没有找到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

总结

以上就是本文关于java编程无向图结构的存储及DFS操作代码详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:

Java编程实现基于图的深度优先搜索和广度优先搜索完整代码

深度优先与广度优先Java实现代码示例

java编程两种树形菜单结构的转换代码

如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

相关文章

  • Java实现的简单画图板示例

    Java实现的简单画图板示例

    这篇文章主要介绍了Java实现的简单画图板,涉及java使用swing组件进行图形绘制相关操作技巧,需要的朋友可以参考下
    2018-08-08
  • Springboot swagger配置过程详解(idea社区版2023.1.4+apache-maven-3.9.3-bin)

    Springboot swagger配置过程详解(idea社区版2023.1.4+apache-maven-3

    这篇文章主要介绍了Springboot-swagger配置(idea社区版2023.1.4+apache-maven-3.9.3-bin),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • Java 图文并茂讲解主方法中的String[] args参数作用

    Java 图文并茂讲解主方法中的String[] args参数作用

    很多老铁不清楚JAVA主方法中main()里面的的参数是什么意思,以及有什么作用,接下来给大家用最通俗易懂的话来讲解,还不清楚的朋友来看看吧
    2022-04-04
  • Java Lambda表达式超详细介绍

    Java Lambda表达式超详细介绍

    这篇文章主要介绍了Java Lambda表达式,Lambda表达式是Java SE 8中一个重要的新特性, Lambda 表达式(Lambda expression)可以看作是一个匿名函数,基于数学中的λ演算得名,也可称为闭包(Closure),下面来看看文章具体的详细介绍吧
    2022-02-02
  • 自定义对象作为HashMap的Key问题

    自定义对象作为HashMap的Key问题

    这篇文章主要介绍了自定义对象作为HashMap的Key问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Spring Cloud Gateway + Nacos 实现动态路由

    Spring Cloud Gateway + Nacos 实现动态路由

    这篇文章主要介绍了Spring Cloud Gateway + Nacos 实现动态路由的方法,帮助大家实现路由信息的自动更新,感兴趣的朋友可以了解下
    2020-10-10
  • spring boot打包成war包的页面如何存放

    spring boot打包成war包的页面如何存放

    这篇文章主要介绍了spring boot打包成war包的页面该放到哪里,很多朋友对这个问题都很疑惑,今天小编给大家分享一篇教程,需要的朋友可以参考下
    2019-11-11
  • Idea实现接口的方法上无法添加@Override注解的解决方案

    Idea实现接口的方法上无法添加@Override注解的解决方案

    文章介绍了在IDEA中实现接口方法时无法添加@Override注解的问题及其解决方法,主要步骤包括更改项目结构中的Language level到支持该注解的版本,以及在pom.xml文件中指定maven-compiler-plugin的版本以解决自动更新后的问题
    2025-02-02
  • Jenkins集成sonarQube实现代码质量检查过程图解

    Jenkins集成sonarQube实现代码质量检查过程图解

    这篇文章主要介绍了Jenkins集成sonarQube实现代码质量检查过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • java IO 字节流详解及实例代码

    java IO 字节流详解及实例代码

    这篇文章主要介绍了java IO 字节流详解及实例代码的相关资料,需要的朋友可以参考下
    2017-03-03

最新评论