Java基于栈方式解决汉诺塔问题实例【递归与非递归算法】

本文实例讲述了Java基于栈方式解决汉诺塔问题。分享给大家供大家参考,具体如下:

/**
 * 栈方式非递归汉诺塔
 * @author zy
 *
 */
public class StackHanoi
{
  /**
   * @param args
   */
  public static void main(String[] args)
  {
    System.out.println("我们测试结果:");
    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;
  }
}

运行结果:

更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。

(0)

相关推荐

  • java实现任意矩阵Strassen算法

    本例输入为两个任意尺寸的矩阵m * n, n * m,输出为两个矩阵的乘积.计算任意尺寸矩阵相乘时,使用了Strassen算法.程序为自编,经过测试,请放心使用.基本算法是: 1.对于方阵(正方形矩阵),找到最大的l, 使得l = 2 ^ k, k为整数并且l < m.边长为l的方形矩阵则采用Strassen算法,其余部分以及方形矩阵中遗漏的部分用蛮力法. 2.对于非方阵,依照行列相应添加0使其成为方阵. StrassenMethodTest.java package matrixalgorit

  • Java分治法与二分搜索算法实例分析

    本文实例讲述了Java分治法与二分搜索算法.分享给大家供大家参考,具体如下: 1.分治法 分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题相同.递归的解这些子问题,然后将各子问题的解合并得到原问题的解. 分治法所能解决的问题一般具有以下几个特征: 1) 该问题的规模缩小到一定的程度就可以容易地解决 2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质. 3) 利用该问题分解出的子问题的解可以合并为该问题的解: 4) 该问题所分解

  • java 二维数组矩阵乘法的实现方法

    复制代码 代码如下: public interface IMatrixMultiple {     public int[][] mmltiple(int[][]a ,int [][]b); } ?public class MatrixMultiple implements IMatrixMultiple { @Override    public int[][] mmltiple(int[][] a, int[][] b) {         int [][] result = new int

  • Java实现的求逆矩阵算法示例

    本文实例讲述了Java实现的求逆矩阵算法.分享给大家供大家参考,具体如下: package demo; public class MatrixInverse { public static double Det(double [][]Matrix,int N)//计算n阶行列式(N=n-1) { int T0; int T1; int T2; double Num; int Cha; double [][] B; if(N>0) { Cha=0; B=new double[N][N]; Num=

  • java 矩阵乘法的mapreduce程序实现

    java 矩阵乘法的mapreduce程序实现 map函数:对于矩阵M中的每个元素m(ij),产生一系列的key-value对<(i,k),(M,j,m(ij))> 其中k=1,2.....知道矩阵N的总列数;对于矩阵N中的每个元素n(jk),产生一系列的key-value对<(i , k) , (N , j ,n(jk)>, 其中i=1,2.......直到i=1,2.......直到矩阵M的总列数. map package com.cb.matrix; import stati

  • Java矩阵连乘问题(动态规划)算法实例分析

    本文实例讲述了Java矩阵连乘问题(动态规划)算法.分享给大家供大家参考,具体如下: 问题描述:给定n个矩阵:A1,A2,...,An,其中Ai与Ai+1是可乘的,i=1,2...,n-1.确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少.输入数据为矩阵个数和每个矩阵规模,输出结果为计算矩阵连乘积的计算次序和最少数乘次数. 问题解析:由于矩阵乘法满足结合律,故计算矩阵的连乘积可以有许多不同的计算次序.这种计算次序可以用加括号的方式来确定.若一个矩阵连乘积的计算次序完全确

  • java实现的n*n矩阵求值及求逆矩阵算法示例

    本文实例讲述了java实现的n*n矩阵求值及求逆矩阵算法.分享给大家供大家参考,具体如下: 先来看看运行结果: java版的写出来了,用的跟c语言相同的算法,然后看看能不能以后加个框做成程序: import java.math.*; import java.util.*; import java.text.*; public class matrix { static int map1[][]=new int [110][110]; static int just[][]=new int [11

  • Java实现的决策树算法完整实例

    本文实例讲述了Java实现的决策树算法.分享给大家供大家参考,具体如下: 决策树算法是一种逼近离散函数值的方法.它是一种典型的分类方法,首先对数据进行处理,利用归纳算法生成可读的规则和决策树,然后使用决策对新数据进行分析.本质上决策树是通过一系列规则对数据进行分类的过程. 决策树构造可以分两步进行.第一步,决策树的生成:由训练样本集生成决策树的过程.一般情况下,训练样本数据集是根据实际需要有历史的.有一定综合程度的,用于数据分析处理的数据集.第二步,决策树的剪枝:决策树的剪枝是对上一阶段生成的决

  • java实现的AES加密算法完整实例

    本文实例讲述了java实现的AES加密算法.分享给大家供大家参考,具体如下: import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import android.util.Base64; /** * @author vipin.cb , vipin.cb@experionglobal.com <br> * Sep 27, 2013

  • 关于各种排列组合java算法实现方法

    一.利用二进制状态法求排列组合,此种方法比较容易懂,但是运行效率不高,小数据排列组合可以使用 复制代码 代码如下: import java.util.Arrays; //利用二进制算法进行全排列//count1:170187//count2:291656 public class test {    public static void main(String[] args) {        long start=System.currentTimeMillis();        count

  • java字符串相似度算法

    本文实例讲述了java字符串相似度算法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: public class Levenshtein {     private int compare(String str, String target) {         int d[][]; // 矩阵         int n = str.length();         int m = target.length();         int i; // 遍历str的      

随机推荐