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
- java版的无向图结构的存储及DFS操作
- 无向图的邻接多重表结构,存储结构及基本功能实现(最全)
- 无向图邻接表的存储结构
- 无向图的邻接多重表存储结构
- 无向网图的邻接矩阵存储结构
- 无向网图的邻接表存储结构
- 数据结构--无向图的邻接多重表存储结构
- 【数据结构笔记】3:无向图的邻接矩阵存储结构
- 链式存储无向图的基本操作
- 无向图的DFS算法
- Java实现无向无权图的邻接矩阵的存储
- 邻接矩阵存储的无向图深度优先(DFS)广度优先(BFS)遍历
- 无向图的邻接表表示法 及 深搜遍历DFS
- 数据结构之无向图的存储
- 无向图的边存储
- 邻接矩阵存储带权值的无向图
- 无向图的邻接矩阵存储
- 无向图的邻接表存储
- Backbone系列:todo的demo
- 门诊医生工作站处方类型的修改-----运维日志3
- 阿里巴巴2014研发工程师实习生面试经历
- C语言中预处理命令#define的用法
- 设计模式C++实现——工厂模式
- java版的无向图结构的存储及DFS操作
- C++程序进入main函数之前,退出main函数之后会做些什么?
- 出口变量增强- 截至到输入日期的本月累计
- CentOS各版本下载地址
- 顺序表
- Apache CloudStack 4.5.2 新特性一览
- 子父类出现后,类成员的特点(变量 、函数)
- 腾讯后台面试
- cocospod国外镜像源不能用