`
zy3381
  • 浏览: 157686 次
  • 性别: Icon_minigender_1
  • 来自: 昆明
社区版块
存档分类
最新评论

非递归汉诺塔(使用栈)

 
阅读更多
/**
 * 栈方式非递归汉诺塔
 * @author zy
 *
 */
public class StackHanoi
{

	/**
	 * @param args
	 */
	public static void main(String[] args)
	{
		System.out.println("递归方式:");
		hanoiNormal(3, 'A', 'B', 'C');
		System.out.println();
		System.out.println("非递归方式:");
		hanoi(3, 'A', 'B', 'C');
	}
	
	/**
	 * 递归汉诺塔
	 * @param n
	 * @param A
	 * @param B
	 * @param C
	 */
	public static void hanoiNormal(int n, char A, char B, char C)
	{
		//hanoiNormal(1, A, B, C)等价于直接移动A到C( move(A,C) )
		if(n==1)
		{
			move(A, C);
			return;
		}
		else
		{
			hanoiNormal(n-1, A, C, B);
			move(A, C);
			hanoiNormal(n-1, B, A, C);
		}
	}
	
	/**
	 * 非递归汉诺塔
	 * @param n
	 * @param A
	 * @param B
	 * @param C
	 */
	public static void hanoi(int n, char A, char B, char C)
	{
		//创建一个栈
		StateStack s = new StateStack();
		//将开始状态进栈
		s.push( new State(n, A, B, C) );
		//保存出栈元素
		State state = null;
		//出栈
		while((state = s.pop()) != null)
		{
			//如果n为1( hanoi(1,A,B,C) ),直接移动A->C
			if(state.n == 1)
			{
				move(state.A, state.C);
			}
			//如果n大于1,则按照递归的思路,先处理hanoi(n-1,A,C,B),再移动A->C(等价于hanoi(1,A,B,C) ),然后处理hanoi(n-1,B,A,C),因为是栈,所以要逆序添加
			else
			{
				//栈结构先进后出,所以需要逆序进栈
				s.push( new State(state.n-1, state.B, state.A, state.C) );
				s.push( new State(1, state.A, state.B, state.C) );
				s.push( new State(state.n-1, state.A, state.C, state.B) );
			}
		}
	}
	
	/**
	 * 从s到d移动盘子
	 */
	public static void  move(char s, char d)
	{
		System.out.println(s+"->"+d);
	}

}

//状态
class State
{
	public int n;
	public char A;
	public char B;
	public char C;
	public State(int n, char A, char B, char C)
	{
		this.n = n;
		this.A = A;
		this.B = B;
		this.C = C;
	}
}

//栈
class StateStack
{
	private State[] storage = new State[1000];
	//栈顶
	private int top = 0;
	//入栈
	public void push(State s)
	{
		storage[top++] = s;
	}
	//出栈
	public State pop()
	{
		if(top>0)
		{
			return storage[--top];
		}
		return null;
	}
}











分享到:
评论

相关推荐

    C#汉诺塔非递归

    在C#中,解决汉诺塔问题通常采用递归方法,但本话题探讨的是如何使用非递归算法,通过栈数据结构来解决。 非递归解决方案的核心在于模拟汉诺塔的移动过程,这通常涉及到两个辅助柱子和一个目标柱子。在C#中,我们...

    汉诺塔的非递归实现,c++

    非递归算法通常通过使用数据结构(如栈)来模拟递归过程,从而避免了递归调用带来的额外开销。 首先,我们需要创建一个栈来存储盘子的状态。栈将用于保存每个盘子的移动顺序,以便在适当的时候回溯。在C++中,可以...

    用栈实现汉诺塔的非递归算法c++

    我用vc编了一个用栈实现汉诺塔的非递归程序。可以运行的,里面代码作了说明的!

    用栈实现汉诺塔问题

    任意输入N个盘,在三个柱子上实现汉诺塔问题的非递归求解,用栈进行

    汉诺塔非递归算法 用栈 C语言

    用栈来实现汉诺塔,要明白递归就是栈的重要应用之一,递归是系统自动调用栈来处理。

    汉诺塔-汉诺塔的非递归实现源码和原理讲解

    总之,非递归汉诺塔问题的解决方法利用了栈的数据结构,通过迭代实现盘子的有序移动,从而避免了递归可能导致的堆栈溢出问题,尤其适用于处理大规模问题。理解和实现这个算法有助于深化对数据结构和算法的理解,以及...

    汉诺塔非递归程序

    非递归汉诺塔程序通过巧妙的设计,展示了如何在不使用递归的情况下解决复杂问题,这不仅是一次对经典算法的创新应用,也是对计算机科学领域中算法优化理念的一次深刻体现。对于学习者而言,掌握这类算法的非递归实现...

    汉诺塔递归与非递归两种算法的代码与结果对比

    "no differences"的结果表明,无论使用递归还是非递归算法,它们都能正确解决汉诺塔问题,并且得到相同的移动序列。这验证了非递归算法的正确性,同时也证明了两种方法在逻辑上的一致性。 **总结** 汉诺塔问题展示...

    汉诺塔非递归算法

    总的来说,非递归汉诺塔算法提供了一种不同于传统递归解法的思路,它不仅有助于理解问题的本质,还能在某些情况下提高程序的性能。学习并理解这种算法对于提升编程思维和问题解决能力大有裨益。

    一个关于汉诺塔的非递归算法

    理解和实现非递归的汉诺塔算法有助于提升对问题解决策略的理解,尤其是如何利用循环和栈数据结构来解决递归问题。这对于学习算法和数据结构,尤其是面试准备,都是非常有价值的练习。通过阅读和分析代码,你可以更...

    汉诺塔非递归算法 数据结构

    在实际编程实现"汉诺塔非递归算法"时,可以使用如Python这样的高级语言,通过定义栈类并编写相应的移动函数来完成任务。代码会包括初始化栈、处理边界条件、进行盘子移动等逻辑。文件"HanoiNRecursion"可能包含了...

    关于汉诺塔非递归程序

    总的来说,实现非递归汉诺塔程序涉及对C语言基础的深刻理解和巧妙应用,尤其是对数据结构和算法的理解。通过这样的实践,我们可以提高问题解决能力和编程技巧,同时避免了递归可能导致的效率问题。

    汉诺塔-非递归-java程序代码+实验报告

    在这个非递归的Java程序实现中,我们主要探讨如何用非递归算法解决汉诺塔问题。 首先,汉诺塔问题的基本规则是: 1. 每个盘子都有一个唯一的大小,大盘子在下,小盘子在上。 2. 一次只能移动一个盘子。 3. 盘子不能...

    Java编程用栈来求解汉诺塔问题的代码实例(非递归)

    Java编程用栈来求解汉诺塔问题的代码实例(非递归) 本文主要介绍了Java编程用栈来求解汉诺塔问题的代码实例(非递归),并给大家分享了相关的代码实现和原理。 汉诺塔问题 汉诺塔问题是一个经典的问题,它的游戏...

    hannuota.rar_Hanoi_non-recursive_hannuota_汉诺塔_汉诺塔-递归算法_递归 非递归

    7. **代码实现**:使用Python或其他编程语言,可以编写一个简单的非递归汉诺塔函数,该函数使用栈来模拟移动过程,并打印每一步的移动操作。 8. **心得与解析**:非递归解法需要对问题进行更深入的理解,因为必须...

    汉诺塔问题非递归算法的实现

    ### 汉诺塔问题非递归算法的实现 #### 1. 汉诺塔问题概述 汉诺塔(Hanoi Tower)问题是一个经典的递归问题,在数学领域有着广泛的应用。该问题最初由法国数学家Édouard Lucas于1883年提出。汉诺塔问题涉及到三个...

    C++编写汉诺塔的非递归解法

    非递归解法通常涉及使用循环和栈来实现,这种方法更易于理解和实现,同时也减少了内存的使用。 首先,我们需要一个数据结构来表示汉诺塔的状态,这通常是一个二维数组或列表,用来存储每个柱子上的盘子。例如,我们...

    汉诺塔非递归 源代码加运行结果

    汉诺塔问题是一种经典的递归算法示例,但本文档提供的源代码展示了如何用非递归的方式解决这一问题。汉诺塔游戏的目标是将所有盘子从一个柱子移动到另一个柱子上,每次只能移动一个盘子,且任何时候都不能将大盘子...

    汉诺塔问题的非递归算法分析.doc

    非递归算法可以使用迭代的方法来解决汉诺塔问题,例如使用循环来模拟递归算法的过程。 在本文中,我们将对汉诺塔问题的非递归算法进行分析,并探讨其与递归算法的差异和优缺。我们还将对汉诺塔问题的解决方法进行...

    c语言汉诺塔算法,递归,非递归

    非递归解法通常使用栈或队列来模拟递归过程。每一步操作都可以看作是一个状态,包括当前圆盘的位置和即将进行的操作。通过不断迭代和更新状态,直到所有圆盘都到达目标柱子。 对于汉诺塔问题,非递归解法的关键在于...

Global site tag (gtag.js) - Google Analytics