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

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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值