自己用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[n]; dfs = new Vertex[n]; bfs = new Vertex[n]; } public Graph(int n, boolean is){ this.is = is; vertexList = new Vertex[n]; dfs = new Vertex[n]; bfs = new Vertex[n]; } // 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+"."; } }