自己用java寫了個圖資料結構的簡單實現,可以設定有向圖和無向圖。
該類還實現了迭代方法,廣度優先和深度優先
原始碼:
package my.graph;<br />import java.util.ArrayList;<br />import java.util.Iterator;<br />import my.queue.*;<br />import my.stack.StackX;<br />/**<br /> * 鄰接表表示<br /> * @author xiayi<br /> *<br /> */<br />public class Graph {<br />private int MAX_VERTS = 20;<br />private Vertex vertexList[];<br />private boolean is = false;//是否為有向圖<br />private int nVerts = 0;</p><p>private StackX stackX;<br />private Vertex dfs[];</p><p>private Vertex bfs[];<br />private Queue queue;</p><p>public Graph(){<br />vertexList = new Vertex[MAX_VERTS];<br />dfs = new Vertex[MAX_VERTS];<br />bfs = new Vertex[MAX_VERTS];<br />}<br />public Graph(int n){<br />vertexList = new Vertex[n];<br />dfs = new Vertex[n];<br />bfs = new Vertex[n];</p><p>}<br />public Graph(int n, boolean is){<br />this.is = is;<br />vertexList = new Vertex[n];<br />dfs = new Vertex[n];<br />bfs = new Vertex[n];<br />}<br />//////////////////////////////////////////////<br />public boolean isIs() {<br />return is;<br />}<br />public void setIs(boolean is) {<br />this.is = is;<br />}<br />public Vertex[] getVertexList() {<br />return vertexList;<br />}<br />public Vertex[] getDfs() {<br />return dfs;<br />}<br />public Vertex[] getBfs() {<br />return bfs;<br />}</p><p>////////////////////////////////////////////////////<br />/**<br /> * 添加頂點<br /> */<br />public void addVertex(Vertex vertex){<br />vertex.setIndex(nVerts);<br />vertexList[nVerts] = vertex;<br />nVerts++;<br />}<br />/**<br /> * 添加邊<br /> */<br />public void addEdge(int start, int end){<br />vertexList[start].addAdj(vertexList[end]);<br />if (!is) {vertexList[end].addAdj(vertexList[start]);}<br />}<br />/**<br /> * 返回節點個數<br /> * @return<br /> */<br />public int getVertsCount(){<br />return vertexList.length;<br />}</p><p>/**<br /> * 深度優先迭代器<br /> * @return<br /> */<br />public Iterator dfsIterator(){<br />dfs();<br />return new DfsIterator();<br />}<br />/**<br /> * 廣度優先迭代器<br /> * @return<br /> */<br />public Iterator bfsIterator(){<br />bfs();<br />return new BfsIterator();<br />}<br />////////////////////////////////////////////////////////<br />public void displayGraph(){<br />ArrayList<Vertex> next = null;<br />for (int i = 0; i < vertexList.length; i++) {<br />printVertx(vertexList[i]);<br />}<br />}<br />public void printVertx(Vertex vertex){<br />ArrayList<Vertex> next = vertex.getAdj();<br />if(next == null){ System.out.println(vertex.toString()+" 無連接點");}<br />else{<br />System.out.print(vertex.toString()+"有鄰接點:");<br />for (int i = 0; i < next.size(); i++) {<br />System.out.print("頂點"+next.get(i).label+", ");<br />}<br />System.out.println();<br />}<br />}</p><p>///////////////////////////////////////////////////////////</p><p>public void dfs(){<br />stackX = new StackX(MAX_VERTS);<br />vertexList[0].isVisted = true;<br />dfs[0] = vertexList[0];</p><p>stackX.push(vertexList[0]);<br />int dfsIndex = 0;</p><p>Vertex vertex;<br />while(!stackX.isEmpty()){<br />vertex = getAdjVertex((Vertex)stackX.peek());<br />if(vertex == null){<br />stackX.pop();<br />}else{<br />vertex.isVisted = true;<br />dfs[++dfsIndex]=vertex;<br />stackX.push(vertex);<br />}<br />}</p><p>for (int i = 0; i < getVertsCount(); i++) {<br />vertexList[i].isVisted = false;<br />}</p><p>}</p><p>public void bfs() {<br />queue = new Queue(MAX_VERTS);<br />vertexList[0].isVisted = true;<br />bfs[0] = vertexList[0];<br />queue.insert(vertexList[0]);<br />int bfsIndex = 0;<br />Vertex vertex;<br />while(!queue.isEmpty()){<br />Vertex vertex2 = (Vertex)queue.remove();<br />while((vertex = getAdjVertex(vertex2))!=null){<br />vertex.isVisted = true;<br />bfs[++bfsIndex] = vertex;<br />queue.insert(vertex);<br />}<br />}</p><p>for (int i = 0; i < getVertsCount(); i++) {<br />vertexList[i].isVisted = false;<br />}<br />}<br />/**<br /> * 得到一個鄰接點<br /> * @param vertex<br /> * @return<br /> */<br />public Vertex getAdjVertex(Vertex vertex){<br />ArrayList<Vertex> adjVertexs = vertex.getAdj();<br />for (int i = 0; i < adjVertexs.size(); i++) {<br />if(!adjVertexs.get(i).isVisted){<br />return adjVertexs.get(i);<br />}<br />}<br />return null;<br />}<br />/////////////////////////////////////////////////////////////<br />private abstract class GraphIterator implements Iterator{</p><p>int count = 0;<br />public GraphIterator(){<br />}<br />public boolean hasNext() {<br />return count != getVertsCount()-1;<br />}<br />public Object next() {<br />// TODO Auto-generated method stub<br />return null;<br />}<br />public void remove() {<br />// TODO Auto-generated method stub</p><p>}</p><p>}<br />//深度優先迭代<br />private class DfsIterator extends GraphIterator{<br />public DfsIterator(){<br />super();<br />}</p><p>public Vertex next() {<br />return dfs[count++];<br />}<br />}<br />//廣度優先迭代<br />private class BfsIterator extends GraphIterator{<br />public BfsIterator(){<br />super();<br />}</p><p>public Object next() {<br />return bfs[count++];<br />}<br />}<br />/////////////////////////////////////////////////////////</p><p>public static void main(String[] args) {<br />int nVerts = 10;<br />int c = 'A'-1;<br />Vertex vertex;<br />Graph myGraph = new Graph(nVerts, false);<br />for (int i = 0; i < nVerts; i++) {<br />c++;<br />vertex = new Vertex((char)(c));<br />myGraph.addVertex(vertex);<br />}<br />myGraph.addEdge(0, 1);<br />myGraph.addEdge(0, 4);<br />myGraph.addEdge(1, 2);<br />myGraph.addEdge(2, 3);<br />myGraph.addEdge(4, 5);<br />myGraph.addEdge(4, 6);<br />myGraph.addEdge(5, 8);<br />myGraph.addEdge(6, 7);<br />myGraph.addEdge(7, 8);<br />myGraph.addEdge(8, 9);</p><p>System.out.println("深度優先迭代遍曆:");<br />for (Iterator iterator = myGraph.dfsIterator(); iterator.hasNext();) {<br />vertex = (Vertex) iterator.next();<br />System.out.println(vertex.toString());</p><p>}</p><p>System.out.println("/n廣度優先迭代遍曆:");<br />for (Iterator iterator = myGraph.bfsIterator(); iterator.hasNext();) {<br />vertex = (Vertex) iterator.next();<br />System.out.println(vertex.toString());</p><p>}<br />}<br />}<br />class Vertex{<br />public char label;<br />public boolean isVisted;<br />public int index;<br />private ArrayList<Vertex> next = null;<br />public Vertex(char lab) // constructor<br />{<br />label = lab;<br />isVisted = false;<br />}<br />//為節點添加鄰接點<br />public void addAdj(Vertex ver){<br />if(next == null) next = new ArrayList<Vertex>();<br />next.add(ver);<br />}</p><p>public ArrayList<Vertex> getAdj(){<br />return next;<br />}</p><p>public void setIndex(int index){<br />this.index = index;<br />}</p><p>public String toString(){<br />return "頂點 "+label+",下標:"+index+".";<br />}<br />}<br />