用邻接表表示图【java实现】
2010-06-21 11:38
323 查看
自己用java写了个图数据结构的简单实现,可以设置有向图和无向图。
该类还实现了迭代方法,广度优先和深度优先
源代码:
该类还实现了迭代方法,广度优先和深度优先
源代码:
package my.graph; import java.util.ArrayList; import java.util.Iterator; import my.queue.*; import my.stack.StackX; /** * 邻接表表示 * @author xiayi * */ public class Graph { private int MAX_VERTS = 20; private Vertex vertexList[]; private boolean is = false;//是否为有向图 private int nVerts = 0; private StackX stackX; private Vertex dfs[]; private Vertex bfs[]; private Queue queue; public Graph(){ vertexList = new Vertex[MAX_VERTS]; dfs = new Vertex[MAX_VERTS]; bfs = new Vertex[MAX_VERTS]; } public Graph(int n){ vertexList = new Vertex ; dfs = new Vertex ; bfs = new Vertex ; } public Graph(int n, boolean is){ this.is = is; vertexList = new Vertex ; dfs = new Vertex ; bfs = new Vertex ; } ////////////////////////////////////////////// public boolean isIs() { return is; } public void setIs(boolean is) { this.is = is; } public Vertex[] getVertexList() { return vertexList; } public Vertex[] getDfs() { return dfs; } public Vertex[] getBfs() { return bfs; } //////////////////////////////////////////////////// /** * 添加顶点 */ public void addVertex(Vertex vertex){ vertex.setIndex(nVerts); vertexList[nVerts] = vertex; nVerts++; } /** * 添加边 */ public void addEdge(int start, int end){ vertexList[start].addAdj(vertexList[end]); if (!is) {vertexList[end].addAdj(vertexList[start]);} } /** * 返回节点个数 * @return */ public int getVertsCount(){ return vertexList.length; } /** * 深度优先迭代器 * @return */ public Iterator dfsIterator(){ dfs(); return new DfsIterator(); } /** * 广度优先迭代器 * @return */ public Iterator bfsIterator(){ bfs(); return new BfsIterator(); } //////////////////////////////////////////////////////// public void displayGraph(){ ArrayList<Vertex> next = null; for (int i = 0; i < vertexList.length; i++) { printVertx(vertexList[i]); } } public void printVertx(Vertex vertex){ ArrayList<Vertex> next = vertex.getAdj(); if(next == null){ System.out.println(vertex.toString()+" 无连接点");} else{ System.out.print(vertex.toString()+"有邻接点:"); for (int i = 0; i < next.size(); i++) { System.out.print("顶点"+next.get(i).label+", "); } System.out.println(); } } /////////////////////////////////////////////////////////// public void dfs(){ stackX = new StackX(MAX_VERTS); vertexList[0].isVisted = true; dfs[0] = vertexList[0]; stackX.push(vertexList[0]); int dfsIndex = 0; Vertex vertex; while(!stackX.isEmpty()){ vertex = getAdjVertex((Vertex)stackX.peek()); if(vertex == null){ stackX.pop(); }else{ vertex.isVisted = true; dfs[++dfsIndex]=vertex; stackX.push(vertex); } } for (int i = 0; i < getVertsCount(); i++) { vertexList[i].isVisted = false; } } public void bfs() { queue = new Queue(MAX_VERTS); vertexList[0].isVisted = true; bfs[0] = vertexList[0]; queue.insert(vertexList[0]); int bfsIndex = 0; Vertex vertex; while(!queue.isEmpty()){ Vertex vertex2 = (Vertex)queue.remove(); while((vertex = getAdjVertex(vertex2))!=null){ vertex.isVisted = true; bfs[++bfsIndex] = vertex; queue.insert(vertex); } } for (int i = 0; i < getVertsCount(); i++) { vertexList[i].isVisted = false; } } /** * 得到一个邻接点 * @param vertex * @return */ public Vertex getAdjVertex(Vertex vertex){ ArrayList<Vertex> adjVertexs = vertex.getAdj(); for (int i = 0; i < adjVertexs.size(); i++) { if(!adjVertexs.get(i).isVisted){ return adjVertexs.get(i); } } return null; } ///////////////////////////////////////////////////////////// private abstract class GraphIterator implements Iterator{ int count = 0; public GraphIterator(){ } public boolean hasNext() { return count != getVertsCount()-1; } public Object next() { // TODO Auto-generated method stub return null; } public void remove() { // TODO Auto-generated method stub } } //深度优先迭代 private class DfsIterator extends GraphIterator{ public DfsIterator(){ super(); } public Vertex next() { return dfs[count++]; } } //广度优先迭代 private class BfsIterator extends GraphIterator{ public BfsIterator(){ super(); } public Object next() { return bfs[count++]; } } ///////////////////////////////////////////////////////// public static void main(String[] args) { int nVerts = 10; int c = 'A'-1; Vertex vertex; Graph myGraph = new Graph(nVerts, false); for (int i = 0; i < nVerts; i++) { c++; vertex = new Vertex((char)(c)); myGraph.addVertex(vertex); } myGraph.addEdge(0, 1); myGraph.addEdge(0, 4); myGraph.addEdge(1, 2); myGraph.addEdge(2, 3); myGraph.addEdge(4, 5); myGraph.addEdge(4, 6); myGraph.addEdge(5, 8); myGraph.addEdge(6, 7); myGraph.addEdge(7, 8); myGraph.addEdge(8, 9); System.out.println("深度优先迭代遍历:"); for (Iterator iterator = myGraph.dfsIterator(); iterator.hasNext();) { vertex = (Vertex) iterator.next(); System.out.println(vertex.toString()); } System.out.println("/n广度优先迭代遍历:"); for (Iterator iterator = myGraph.bfsIterator(); iterator.hasNext();) { vertex = (Vertex) iterator.next(); System.out.println(vertex.toString()); } } } class Vertex{ public char label; public boolean isVisted; public int index; private ArrayList<Vertex> next = null; public Vertex(char lab) // constructor { label = lab; isVisted = false; } //为节点添加邻接点 public void addAdj(Vertex ver){ if(next == null) next = new ArrayList<Vertex>(); next.add(ver); } public ArrayList<Vertex> getAdj(){ return next; } public void setIndex(int index){ this.index = index; } public String toString(){ return "顶点 "+label+",下标:"+index+"."; } }
相关文章推荐
- 用邻接表表示图【java实现】
- 图的深度优先和广度优先遍历(图以邻接表表示,由C++面向对象实现)
- C语言:实现图的邻接表存储表示
- Java对象表示方式2:XStream实现对对象的XML化
- 表示数值的字符串java实现
- 一个整数二进制表示中1的个数 java实现
- java实现输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
- 数据结构学习----线性表的链式表示(Java实现)
- 数据结构学习----线性表的链式表示之循环双链表(Java实现)
- 39.数据结构笔记之三十九图的邻接表表示实现
- java实现邻接表图、DFS、BFS
- 图(有向图)的邻接表表示 C++实现(遍历,拓扑排序,最短路径,最小生成树) Implement of digraph and undigraph using adjacency list
- 数据结构的C实现_图_邻接表表示
- 数据结构与算法分析笔记与总结(java实现)--字符串4:表示数值的字符串
- 数据结构 《2》----基于邻接表表示的图的实现 DFS(递归和非递归), BFS
- 邻接表存储图Java实现
- Java实现基于邻接表的图的几个应用
- YYMMDD转换成4位字符压缩表示算法java实现——应用各位不等进制的思想
- 利用邻接表求解所有节点的最短路径 java实现 可运行
- Java实现将数字转化为繁体汉字表示