Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

I am trying to create an Iterative solution. Can you help pinpoint where my codi

ID: 3741239 • Letter: I

Question

I am trying to create an Iterative solution. Can you help pinpoint where my coding is off? Thanks.

public class TowersOfHanoiIteration {

  

   class Stack {

  

   int maxSize;

   int topOfArray;

   int array[];

  

   }

   

   Stack newStack(int maxSize) {

      

       Stack stack = new Stack();

       stack.maxSize = maxSize;

       stack.topOfArray = -1;

       stack.array = new int[maxSize];

       return stack;

      

   }

  

   boolean stackIsFull (Stack stack) {

      

       return (stack.topOfArray == stack.maxSize -1);

      

   }

  

   boolean stackIsEmpty (Stack stack) {

      

       return (stack.topOfArray == -1);

      

   }

  

   void push (char start, int data) {

      

       if (stackIsFull(start))

           return;

       start.array[++start.topOfArray] = data;

   }

  

  

   int pop (Stack stack) {

      

       if (stackIsEmpty(stack))

           return Integer.MIN_VALUE;

           return stack.array[stack.topOfArray--];

      

   }

  

   void moveBetweenTowers (Stack Tower1, Stack Tower2, char start, char next) {

      

       int Tower1Top = pop(Tower1);

      

       int Tower2Top = pop(Tower2);

      

       if (Tower1Top == Integer.MIN_VALUE) {

          

           push(Tower1, Tower2Top);

           moveDisk (next, start, Tower2Top);

          

       } else if (Tower2Top == Integer.MIN_VALUE) {

              

               push(next, Tower1Top);

               moveDisk(start, next, Tower1Top);

              

           } else if (Tower1Top > Tower2Top) {

              

               push(start, Tower1Top);

               push(start, Tower2Top);

               moveDisk(start, next, Tower1Top);

              

           } else {

              

               push(next, Tower2Top);

               push(next, Tower1Top);

               moveDisk(start, next, Tower1Top);

       }

      

   }

  

   void moveDisk (char startTower, char nextTower, int Disk) {

      

       System.out.println("Move disk " + Disk + " from " + startTower + " to " + nextTower);

   }

  

   void TowersOfHanoiIterative (int totalDisks, Stack Tower1, Stack stackEmpty, Stack Tower2) {

      

       int i;

       int maxMoves;

      

       char start ='A', next = 'B', a ='C';

      

       if (totalDisks % 2 == 0) {

          

           char temp = next;

          

           next = start;

          

           start = temp;

          

       }

      

       maxMoves = (int)(Math.pow(2, totalDisks) - 1);

      

      

       for (i = totalDisks; i >= 1; i--)

           push(start, i);

      

       for (i =1; i <=maxMoves; i++) {

          

           if (i%3 == 1)

               moveBetweenTowers(Tower1,Tower2, start, next);

          

           else if (i % 3 == 2)

               moveBetweenTowers(Tower1, stackEmpty, start, a);

          

           else if (i%3 == 0 )

               moveBetweenTowers(stackEmpty, Tower2, a, next);

              

              

           }

          

       }

      

   public static void main (String args[]) {

      

       int totalDisks = 3;

      

       TowersOfHanoiIteration ob = new TowersOfHanoiIteration();

      

       Stack Tower1, Tower2, stackempty;

      

       Tower1 = ob.createStack(totalDisks);

       Tower2 = ob.createStack(totalDisks);

       stackEmpty = ob.createStack(totalDisks);

      

       ob.TowersOfHanoiIterative(totalDisks, Tower1, stackEmpty, Tower2);

      

   }

  

   }

      

Explanation / Answer

Hello There is only one problem with program when top of Tower1 > top of Tower2 then you have to move the top of tower 2 from next to start. So change the below code

else if (Tower1Top > Tower2Top) {

               push(start, Tower1Top);

               push(start, Tower2Top);

               moveDisk(start, next, Tower1Top);

To

else if (Tower1Top > Tower2Top) {

               push(start, Tower1Top);

               push(start, Tower2Top);

               moveDisk(next, start, Tower2Top);

That was the only mistake . Rest of the code is perfectly fine. Btw nice code.

So Rewriting the Code:

public class TowersOfHanoiIteration {

   

    class Stack {

   

    int maxSize;

    int topOfArray;

    int array[];

   

    }

    

    Stack newStack(int maxSize) {

       

        Stack stack = new Stack();

        stack.maxSize = maxSize;

        stack.topOfArray = -1;

        stack.array = new int[maxSize];

        return stack;

       

    }

   

    boolean stackIsFull (Stack stack) {

       

        return (stack.topOfArray == stack.maxSize -1);

       

    }

   

    boolean stackIsEmpty (Stack stack) {

       

        return (stack.topOfArray == -1);

       

    }

   

    void push (char start, int data) {

       

        if (stackIsFull(start))

            return;

        start.array[++start.topOfArray] = data;

    }

   

   

    int pop (Stack stack) {

       

        if (stackIsEmpty(stack))

            return Integer.MIN_VALUE;

            return stack.array[stack.topOfArray--];

       

    }

   

    void moveBetweenTowers (Stack Tower1, Stack Tower2, char start, char next) {

       

        int Tower1Top = pop(Tower1);

       

        int Tower2Top = pop(Tower2);

       

        if (Tower1Top == Integer.MIN_VALUE) {

           

            push(Tower1, Tower2Top);

            moveDisk (next, start, Tower2Top);

           

        } else if (Tower2Top == Integer.MIN_VALUE) {

               

                push(next, Tower1Top);

                moveDisk(start, next, Tower1Top);

               

            } else if (Tower1Top > Tower2Top) {

               

                push(start, Tower1Top);

                push(start, Tower2Top);

                moveDisk(next, start, Tower2Top);

               

            } else {

               

                push(next, Tower2Top);

                push(next, Tower1Top);

                moveDisk(start, next, Tower1Top);

        }

       

    }

   

    void moveDisk (char startTower, char nextTower, int Disk) {

       

        System.out.println("Move disk " + Disk + " from " + startTower + " to " + nextTower);

    }

   

    void TowersOfHanoiIterative (int totalDisks, Stack Tower1, Stack stackEmpty, Stack Tower2) {

       

        int i;

        int maxMoves;

       

        char start ='A', next = 'B', a ='C';

       

        if (totalDisks % 2 == 0) {

           

            char temp = next;

           

            next = start;

           

            start = temp;

           

        }

       

        maxMoves = (int)(Math.pow(2, totalDisks) - 1);

       

       

        for (i = totalDisks; i >= 1; i--)

            push(start, i);

       

        for (i =1; i <=maxMoves; i++) {

           

            if (i%3 == 1)

                moveBetweenTowers(Tower1,Tower2, start, next);

           

            else if (i % 3 == 2)

                moveBetweenTowers(Tower1, stackEmpty, start, a);

           

            else if (i%3 == 0 )

                moveBetweenTowers(stackEmpty, Tower2, a, next);

               

               

            }

           

        }

       

    public static void main (String args[]) {

       

        int totalDisks = 3;

       

        TowersOfHanoiIteration ob = new TowersOfHanoiIteration();

       

        Stack Tower1, Tower2, stackempty;

       

        Tower1 = ob.createStack(totalDisks);

        Tower2 = ob.createStack(totalDisks);

        stackEmpty = ob.createStack(totalDisks);

       

        ob.TowersOfHanoiIterative(totalDisks, Tower1, stackEmpty, Tower2);

       

    }

   

    }

Hire Me For All Your Tutoring Needs
Integrity-first tutoring: clear explanations, guidance, and feedback.
Drop an Email at
drjack9650@gmail.com
Chat Now And Get Quote