diff --git a/src/dataANDcalc/java/algorithm/HanoTower.java b/src/dataANDcalc/java/algorithm/HanoTower.java new file mode 100644 index 0000000..d0109a8 --- /dev/null +++ b/src/dataANDcalc/java/algorithm/HanoTower.java @@ -0,0 +1,72 @@ +package algorithm; + +import java.util.Stack; + +public class HanoTower { + + private Stack towerA; + + private Stack towerB; + + private Stack towerC; + + public HanoTower(int num){ + towerA = new Stack<>(); + towerB = new Stack<>(); + towerC = new Stack<>(); + for (int i = num; i > 0; i--) { + towerA.push(i); + } + } + + public void move(String source, String target, String temp, int towerNum){ + if(towerNum == 1){ + Stack sourceStack = null; + Stack targetStack = null; + if(source.equals("A")){ + sourceStack = towerA; + if(target.equals("B")){ + targetStack = towerB; + } else if(target.equals("C")){ + targetStack = towerC; + } + } + if(source.equals("B")){ + sourceStack = towerB; + if(target.equals("A")){ + targetStack = towerA; + } else if(target.equals("C")){ + targetStack = towerC; + } + } + if(source.equals("C")){ + sourceStack = towerC; + if(target.equals("A")){ + targetStack = towerA; + } else if(target.equals("B")){ + targetStack = towerB; + } + } + // 取出当前栈的头部盘子 + int top = sourceStack.pop(); + // 将盘子放入目标栈中 + targetStack.push(top); + System.out.println("移动" + top + "号盘子,从" + source + "到" + target); + return; + } + // 将所有的情况看成移动两个盘子 + // 首先将上面的盘子移动到暂时塔中 + move(source, temp, target, towerNum - 1); + // 然后将下面的盘子从原来的塔移动到目标塔中 + move(source, target, temp, 1); // 这里的1实际上是towerNum - (towerNum - 1) + // 最后再将暂时塔的盘子移动到目标塔中 + move(temp, target, source, towerNum - 1); + } + + + public static void main(String[] args) { + HanoTower hanoTower = new HanoTower(5); + hanoTower.move("A", "C", "B", 5); + } + +}