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

所属分类: 软件编程 / java 阅读数: 29
收藏 0 赞 0 分享

图的概念

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

无向图                                                       有向图

图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实现背单词程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

java实现单词查询小程序

这篇文章主要为大家详细介绍了java实现单词查询小程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Java程序开发环境配置图文教程

这篇文章主要为大家详细介绍了Java程序开发环境配置图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

详解ssh框架原理及流程

在本文中小编给大家整理的是关于ssh框架原理及流程的相关知识点内容,有此需要的朋友们可以学习下。
收藏 0 赞 0 分享

Java实现弹窗效果的基本操作

这篇文章主要为大家详细介绍了Java实现弹窗效果的基本操作,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

详解springmvc常用5种注解

在本篇里我们给大家总结了关于springmvc常用5种注解相关知识点以及实例代码,需要的朋友们参考下。
收藏 0 赞 0 分享

Java实现弹窗效果的基本操作(2)

这篇文章主要为大家详细介绍了Java实现弹窗效果的基本操作第二篇,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Spring Boot假死诊断实战记录

这篇文章主要给大家介绍了关于Spring Boot假死诊断的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring Boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
收藏 0 赞 0 分享

Java计时新姿势StopWatch详解

这篇文章主要介绍了Java计时新姿势StopWatch,最近公司来了个大佬,从他那里学到不少东西,其中一个就是计时的新姿势「StopWatch」,需要的朋友可以参考下
收藏 0 赞 0 分享

java实现点击按钮弹出新窗体功能

这篇文章主要为大家详细介绍了java实现点击按钮弹出新窗体功能,旧窗体不进行操作,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享
查看更多