package com.interview.algorithms.stackqueue; import java.util.ArrayList; import java.util.List; import java.util.Stack; /** * Created with IntelliJ IDEA. * User: stefanie * Date: 7/15/14 * Time: 11:21 AM */ public class C7_6_HanoiUsingStack { static class Step{ int disk; int from; int to; Step(int disk, int from, int to) { this.disk = disk; this.from = from; this.to = to; } public String toString(){ return disk + " " + from + "-->" + to; } } static class Tower{ Stack<Integer> disks; int index; public Tower(int index){ this.index = index; this.disks = new Stack<>(); } public void add(int disk){ if(!disks.isEmpty() && disks.peek() <= disk) System.err.println("Wrong Place of Disk " + disk + " to tower " + this.index); else disks.push(disk); } public Step moveTopTo(Tower t){ int disk = disks.pop(); t.add(disk); return new Step(disk, this.index, t.index); } public void printState(){ System.out.printf("The state of tower %d is: \n", this.index); for(int i = 0; i < disks.size(); i++){ System.out.print(disks.get(i) + " "); } System.out.println(""); } } int towerNumber = 3; Tower[] towers = new Tower[towerNumber]; public C7_6_HanoiUsingStack(){ for(int i = 0; i < towerNumber; i++) towers[i] = new Tower(i); } public List<Step> solve(int n){ for (int i = n; i > 0; i--) towers[0].add(i); List<Step> steps = new ArrayList<>(); moveDisks(n, towers[0], towers[2], towers[1], steps); return steps; } private void moveDisks(int n, Tower source, Tower dest, Tower buffer, List<Step> steps){ if(n > 0){ moveDisks(n - 1, source, buffer, dest, steps); steps.add(source.moveTopTo(dest)); moveDisks(n - 1, buffer, dest, source, steps); } } }