import java.util.ArrayDeque; import java.util.Deque; public class HanoiStack { // A job still to do: move n disks, or, when single is true, move just disk n. record Job(int n, char source, char target, char spare, boolean single) {} static void hanoi(int disks, char source, char target, char spare) { Deque jobs = new ArrayDeque<>(); jobs.push(new Job(disks, source, target, spare, false)); while (!jobs.isEmpty()) { Job job = jobs.pop(); if (job.single()) { System.out.println("Move disk " + job.n() + " from " + job.source() + " to " + job.target()); } else if (job.n() > 0) { // Pushed in reverse: a stack hands back the last thing pushed first. jobs.push(new Job(job.n() - 1, job.spare(), job.target(), job.source(), false)); jobs.push(new Job(job.n(), job.source(), job.target(), job.spare(), true)); jobs.push(new Job(job.n() - 1, job.source(), job.spare(), job.target(), false)); } } } public static void main(String[] args) { hanoi(3, 'A', 'C', 'B'); } }