Αποτυγχάνουν να εκτυπώσετε τα αποτελέσματα από τον Πύργο του Ανόι χρησιμοποιώντας Linked Λίστα

ψήφοι
-1

Είμαι προσπαθεί να εφαρμόσει ο Πύργος του Ανόι χρησιμοποιώντας μεμονωμένα συνδεδεμένη δομή για ένα πρόβλημα ανάθεση. Παίρνω το μήνυμα λάθους «Stack Underflow», όπως ορίζεται στη μέθοδο isEmpty () κάτω από την κατηγορία στοίβα. Ελπίζω να δείτε το παρακάτω όταν υπόσταση των num_of_disks ως 3 στην κύρια μέθοδο:

Μετακίνηση δίσκο 1 από τον πύργο Α έως πύργος C

Μετακίνηση δίσκο 2 από τον πύργο Α έως πύργο Β

Μετακίνηση δίσκο 1 από τον πύργο C έως πύργο Β

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

    } 
}

Κάθε βοήθεια είναι πολύ εκτίμησα. Ευχαριστώ εκ των προτέρων!

Δημοσιεύθηκε 19/03/2020 στις 21:58
πηγή χρήστη
Σε άλλες γλώσσες...                            

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