数据结构--汉诺塔--借助栈实现非递归---Java

 1 /*汉诺塔非递归实现--利用栈
 2  * 1.创建一个栈,栈中每个元素包含的信息:盘子编号,3个塔座的变量
 3  * 2.先进栈,在利用循环判断是否栈空,
 4  * 3.非空情况下,出栈,检查是否只有一个盘子--直接移动,否则就模拟前面递归的情况--非1的情况
 5  * 4.直到栈空就结束循环,就完成全部的移动。
 6  * */
 7 class Stack11{
 8     Towers[] tt = new Towers[20];
 9     int top = -1;
10
11     public boolean isEmpty(){
12         return top == -1;
13     }
14
15     public void push(Towers t){
16         tt[++top] = t;
17     }
18
19     public Towers pop(){
20         return tt[top--];
21     }
22 }
23
24 class Towers{
25     int diskN;
26     char from;
27     char inter;
28     char to;
29     public Towers(int diskN, char from, char inter, char to) {
30         this.diskN = diskN;
31         this.from = from;
32         this.inter = inter;
33         this.to = to;
34     }
35
36 }
37
38 public class HannoTower_Stack {
39
40     public static void main(String[] args) {
41         Towers t1 = new Towers(3,‘A‘,‘B‘,‘C‘);
42         doTowers(t1);
43     }
44
45     private static void doTowers(Towers t1) {
46         Stack11 stack = new Stack11();
47         stack.push(t1);
48         while(!stack.isEmpty()){
49             Towers temp = stack.pop();
50             //处理是一个盘子的情况--所有打印语句都从这里打印
51             if(temp.diskN == 1){
52                 System.out.println("Top disk " + "from " + temp.from + " to " + temp.to);
53             }
54             //注意处理移动的顺序本来是A-C-B,A-B-C,B-A-C.所以进栈的顺序相反
55             else{
56                 stack.push(new Towers(temp.diskN-1,temp.inter,temp.from,temp.to));
57                 stack.push(new Towers(1,temp.from,temp.inter,temp.to));
58                 stack.push(new Towers(temp.diskN-1,temp.from,temp.to,temp.inter));
59             }
60         }
61
62     }
63
64 }

执行结果:

Top disk from A to C
Top disk from A to B
Top disk from C to B
Top disk from A to C
Top disk from B to A
Top disk from B to C
Top disk from A to C

时间: 2024-08-29 18:05:56

数据结构--汉诺塔--借助栈实现非递归---Java的相关文章

数据结构---汉诺塔

/*汉诺塔:A座有n个盘子,下面直径比上面大,要借助C座,将n个盘子移到B上,移动过程中大盘子一定在小盘子下面*/ package pack; public class Main { static int n = 10; public static void main(String[] args) { han(n,'A','B','C'); //将n个盘子借助C,从A到B } public static void han(int n,char a,char b,char c) { if(n==1

数据结构--汉诺塔递归Java实现

1 /*汉诺塔递归 2 * 1.将编号0-N-1个圆盘,从A塔座移动到B上面 3 * 2.将编号N的1个圆盘,从A移动到C上面 4 * 3.最后将B上面的N-1个圆盘移动到C上面 5 * 注意:盘子的编号从上到下1-N 6 * */ 7 public class HannoTower_Recursion { 8 9 public static void main(String[] args) { 10 int nDisk = 3; 11 doTowers(nDisk,'A','B','C');

NYOJ 88 汉诺塔(一)(递归)

汉诺塔(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵 天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔.不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金 片:一次只移动一片,不管在哪根针上,小片必须在大片上面.僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消

郝斌--数据结构---汉诺塔实现(c语言实现)

1 #include <stdio.h> 2 3 void hannuota(int n,char A,char B,char C)//表示A借助于B移到C 4 { 5 /* 6 如果是1个盘子 7 直接将柱子上的盘子从A移到C 8 否则 9 先将A柱子上的n-1个盘子从C移到B 10 直接将A柱子上的盘子从A移到C 11 最后将B柱子上的n-1个盘子借助A移到C 12 */ 13 if(1 == n) 14 { 15 printf("将编号为%d的盘子直接从%c柱子移到%c柱子\n

算法学习(4)----汉诺塔递归算法和非递归算法

学习<算法设计与分析基础>,习题2.4 第5题要求为汉诺塔游戏设计一个非递归的算法. 思,不得其解.看书后答案提示: 你如果做不到,也不要沮丧:这个问题的非递归算法虽然不复杂,但却不容易发现.作为一种安慰,可以在因特网上寻找答案. 好吧,话都说得这么直接了,遂百度之,得到一个感觉很好的答案,略做修改,摘录于下: 原文地址:http://blog.sina.com.cn/s/blog_48e3f9cd01000474.html ##################################

汉诺塔(Tower of Hanoi)问题的求解——利用栈与递归

汉诺塔(Tower of Hanoi)问题的求解--利用栈与递归 1. 汉诺塔问题的提法 汉诺塔问题是使用递归解决问题的经典范例. 传说婆罗门庙里有一个塔台,台上有3根标号为A.B.C的用钻石做成的柱子,在A柱上放着64个金盘,每一个都比下面的略小一点.把A柱上的金盘全部移到C柱上的那一天就是世界末日. 移动的条件是:一次只能移动一个金盘,移动过程中大金盘不能放在小金盘上面.庙里的僧人一直在移个不停,移动的最少总次数是264?1次,如果每秒移动一次的话,需要500亿年. 2. 求解汉诺塔问题的算

从汉诺塔问题来看“递归”本质

汉诺塔问题 大二上数据结构课,老师在讲解"栈与递归的实现"时,引入了汉诺塔的问题,使用递归来解决n个盘在(x,y,z)轴上移动. 例如下面的动图(图片出自于汉诺塔算法详解之C++): 三个盘的情况: 四个盘的情况: 如果是5个.6个.7个....,该如何移动呢? 于是,老师给了一段经典的递归代码: void hanoi(int n,char x,char y,char z){ if(n == 1) move(x,1,z); else{ hanoi(n-1,x,z,y); move(x,

汉诺塔递归实现

经典问题汉诺塔的实现中,递归实现可以说是代码量最少,并最简单易懂的实现方法了. 假设有三根柱子a,b,c.其中a柱子上有n个金片.我们的目的就是把n个金片借助b,全部移动到c上.这是一个汉诺塔问题. 这个问题可以分解成如下子问题: (1)将n-1个金片从a移动到b.这又是一个汉诺塔问题. (2)上面执行完之后,可以直接将第n个金片移动到c. (3)上面两步执行完之后,将n-1个金片从b移动到c.这又再次是一个汉诺塔问题. 很显然,把上面的步骤翻译成递归形式可以得到如下的程序: 1 #includ

基于HTML5的WebGL设计汉诺塔3D游戏

在这里我们将构造一个基于HT for Web的HTML5+JavaScript来实现汉诺塔游戏. http://hightopo.com/demo/hanoi_20151106/index.html 汉诺塔的游戏规则及递归算法分析请参考http://en.wikipedia.org/wiki/Tower_of_Hanoi. 知道了汉诺塔的规则和算法,现在就开始创建元素.用HT for Web(http://www.hightopo.com)现有的3D模板创建底盘和3根柱子不是问题,问题是要创建若