Итеративное решение Ханойской башни на C с инициализацией стека

“Итеративное решение Ханойской башни на C: инициализация стеков”

Вот один из способов итеративного решения проблемы Ханойской башни на языке C путем инициализации стеков:

  1. Определите структуру для представления узла стека:

    struct StackNode {
    int disk;
    struct StackNode* next;
    };
  2. Реализовать операции со стеком:

    struct StackNode* createNode(int disk) {
    struct StackNode* newNode = (struct StackNode*)malloc(sizeof(struct StackNode));
    newNode->disk = disk;
    newNode->next = NULL;
    return newNode;
    }
    void push(struct StackNode stack, int disk) {
    struct StackNode* newNode = createNode(disk);
    newNode->next = *stack;
    *stack = newNode;
    }
    int pop(struct StackNode stack) {
    if (*stack == NULL)
        return -1; // Stack is empty
    struct StackNode* temp = *stack;
    *stack = (*stack)->next;
    int disk = temp->disk;
    free(temp);
    return disk;
    }
  3. Реализовать итеративное решение Ханойской башни с помощью стеков:

    void towerOfHanoi(int numDisks, char source, char auxiliary, char destination) {
    // Create stacks for source, auxiliary, and destination
    struct StackNode* sourceStack = NULL;
    struct StackNode* auxiliaryStack = NULL;
    struct StackNode* destinationStack = NULL;
    int totalMoves = pow(2, numDisks) - 1;
    // Push disks onto the source stack
    for (int i = numDisks; i >= 1; i--)
        push(&sourceStack, i);
    char temp;
    // If the number of disks is even, swap the auxiliary and destination towers
    if (numDisks % 2 == 0) {
        temp = auxiliary;
        auxiliary = destination;
        destination = temp;
    }
    // Perform the iterative moves
    for (int move = 1; move <= totalMoves; move++) {
        if (move % 3 == 1) {
            moveDisk(&sourceStack, &destinationStack, source, destination);
        } else if (move % 3 == 2) {
            moveDisk(&sourceStack, &auxiliaryStack, source, auxiliary);
        } else if (move % 3 == 0) {
            moveDisk(&auxiliaryStack, &destinationStack, auxiliary, destination);
        }
    }
    }
    void moveDisk(struct StackNode source, struct StackNode destination, char sourceName, char destinationName) {
    int disk = pop(source);
    push(destination, disk);
    printf("Move disk %d from %c to %c\n", disk, sourceName, destinationName);
    }

В этом решении используются три стека для обозначения исходной, вспомогательной и целевой вышек. Он итеративно выполняет ходы на основе общего количества дисков и правил задачи Ханойской башни. Функция moveDiskотвечает за перемещение дисков между стеками и печать шагов перемещения.