Non riescono a stampare i risultati dalla Torre di Hanoi con lista concatenata

voti
-1

Sto cercando di implementare la Torre di Hanoi usando la struttura concatenata semplice per un problema di assegnazione. Continuo a ricevere il messaggio di errore Stack Underflow come specificato nel metodo isEmpty () sotto la classe Stack. Spero di vedere il seguente quando ho istanziare il num_of_disks come 3 nel metodo principale:

Spostare il disco 1 dalla torre A alla torre di C

Spostare il disco 2 dalla torre A alla torre B

Spostare disco 1 dalla torre C a torre B

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);

    } 
}

Ogni aiuto è molto apprezzato. Grazie in anticipo!

È pubblicato 19/03/2020 alle 21:58
fonte dall'utente
In altre lingue...                            

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