DFS采用栈实现非递归

DFS核心类:

package com.dfs;

import java.util.Stack;

/**
 * 图的DFS 非递归遍历算法
 * @author Administrator
 *
 */
public class DFS 
{
	private char[] vertices;		//存储顶点信息
	private int[][] arcs;			//存储边
	private boolean[] visited;		//顶点是否访问过
	private int vexnum;				//顶点个娄
	
	/**
	 * 实例对象时需要传入的顶点的个数
	 * @param n
	 */
	public DFS(int n)
	{
		vexnum = n;
		
		vertices = new char[n];
		
		arcs = new int[n][n];
		
		visited = new boolean[n];
	}
	
	/**
	 * 在顶点之间添加一条边
	 * @param i
	 * @param j
	 */
	public void AddEdge(int i, int j)
	{
		if(i == j) return;
		
		arcs[i][j] = 1;
		arcs[j][i] = 1;
	}
	
	/**
	 * 设置顶点的值
	 * @param vertices
	 */
	public void SetVertices(char[] vertices)
	{
		this.vertices = vertices;
	}
	
	/**
	 * 访问第i个顶点元素
	 * @param i
	 */
	private void visit(int i)
	{
		System.out.print(" "+this.vertices[i]);
	}
	
	/**
	 * 非递归实现
	 */
	public void DFSByStack()
	{
		//初始化访问矩阵
		for(int i = 0; i stack = new Stack();
		
		stack.push(0);			//将第0个元素压入栈
		visited[0] = true;		//第0个元素已经访问
		visit(0);
		
		while(!stack.empty())
		{
			int k = stack.peek().intValue();		//访问栈顶元素但不出栈
			boolean needPop = true;
			
			for(int i=0;i



测试类:

package com.dfs;

public class MainClass {

	
	public static void main(String[] args) 
	{
		
		char[] vertices = {'A','B','C','D','E','F','G','H','I'};
		DFS dfs = new DFS(8);
		
		dfs.SetVertices(vertices);
		
		dfs.AddEdge(0, 1);
		dfs.AddEdge(0, 5);
		
		dfs.AddEdge(1, 0);
		dfs.AddEdge(1, 2);
		dfs.AddEdge(1, 3);
		dfs.AddEdge(1, 4);
		
		dfs.AddEdge(2, 1);
		dfs.AddEdge(2, 6);
		
		dfs.AddEdge(3, 1);
		dfs.AddEdge(3, 7);
		
		dfs.AddEdge(4, 1);
		
		dfs.AddEdge(5, 0);
		
		System.out.println("非递归结果:");
		dfs.DFSByStack();
		
		System.out.println("\n下一个邻接点递归结果:");
		dfs.DFStraverse();
		

	}

}





你可能感兴趣的:(java,基本算法)