No se imprimen los resultados de la Torre de Hanoi usando lista enlazada

votos
-1

Estoy tratando de poner en práctica la Torre de Hanoi usando la estructura de enlace simple para un problema de asignación. Sigo recibiendo el mensaje de error de pila bajo como se especifica en el método estaVacia () en la clase Pila. Estoy esperando a ver el siguiente cuando una instancia de la num_of_disks como 3 en el método principal:

Mover el disco 1 de la torre de la A a la torre C

Mover el disco 2 de la torre de la A a la torre B

Mover el disco 1 de la torre de C a B torre

class Stack {
    private Node top;

    class Node {
        int data;
        Node next;

        Node(Stack stack) {
            stack = new Stack();
        }
    }
    public boolean isEmpty(Stack stack) {
        if(stack.top == null)
            return true;
        else
            return false;
    }
    public int push(Stack stack, int value) {
        Node newNode = new Node(stack);

        newNode.data = value;
        newNode.next = top;
        top = newNode;

        return newNode.data;
    }
    public int pop(Stack stack) {
        int temp = 0;

        if(isEmpty(stack)) {
            System.out.println(Stack underflow);
            System.exit(1);
        }
        else {
            temp = top.data;
            top = top.next;
        }
        return temp;
    }
    public void show(Stack stack) {
        Node currentNode = top;

        while(currentNode.next != null) {
            System.out.print(currentNode.data +  => );
            currentNode = currentNode.next;
        }
        System.out.print(currentNode.data);
    }
}
class TOH {
    private Stack stk;

    TOH() {
        stk = new Stack();
    }

    void moveDisksBetweenTwoPoles(Stack src, Stack dest, char s, char d) { 
        int pole1TopDisk = stk.pop(src); 
        int pole2TopDisk = stk.pop(dest); 

        if (pole1TopDisk == 0) { 
            stk.push(src, pole2TopDisk); 
            moveDisk(d, s, pole2TopDisk); 
        } 
        else if (pole2TopDisk == 0) { 
            stk.push(dest, pole1TopDisk); 
            moveDisk(s, d, pole1TopDisk); 
        } 
        else if (pole1TopDisk > pole2TopDisk) { 
            stk.push(src, pole1TopDisk); 
            stk.push(src, pole2TopDisk); 
            moveDisk(d, s, pole2TopDisk);
        } 
        else { 
            stk.push(dest, pole2TopDisk); 
            stk.push(dest, pole1TopDisk); 
            moveDisk(s, d, pole1TopDisk); 
        } 
    } 

    void moveDisk(char fromPeg, char toPeg, int disk) { 
        System.out.println(Move disk  + disk +  
                         from + fromPeg +  to  + toPeg); 
    } 
    void loadstartTower(int num_of_disks, Stack src) {
        for(int i = num_of_disks; i >= 1; i--) {
            stk.push(src, i);
        }
    }
    int totNumOfMoves(int num_of_disks) {
        int total_num_of_moves = (int)(Math.pow(2, num_of_disks) - 1);
        return total_num_of_moves;
    }
    void tohIterative(int num_of_disks, Stack src, Stack aux, Stack dest) { 
        int i, total_num_of_moves; 
        char s = 'A', d = 'B', a = 'C'; 

        if (num_of_disks % 2 == 0) { 
            char temp = d; 
            d = a; 
            a  = temp; 
        } 

        loadstartTower(num_of_disks, src);

        for (i = 1; i <= totNumOfMoves(num_of_disks); i++) {
            if (i % 3 == 1) 
              moveDisksBetweenTwoPoles(src, dest, s, d); 

            else if (i % 3 == 2) 
              moveDisksBetweenTwoPoles(src, aux, s, a); 

            else if (i % 3 == 0) 
              moveDisksBetweenTwoPoles(aux, dest, a, d); 
        } 
    } 
}
public class Main {
    public static void main(String[] args) { 
        int num_of_disks = 3; 

        TOH ob = new TOH(); 
        Stack src = new Stack();
        Stack dest = new Stack();
        Stack aux = new Stack(); 

        ob.tohIterative(num_of_disks, src, aux, dest);

    } 
}

Cualquier ayuda es muy apreciada. ¡Gracias por adelantado!

Publicado el 19/03/2020 a las 21:58
fuente por usuario
En otros idiomas...                            

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more