“Итеративное решение Ханойской башни на C: инициализация стеков”
Вот один из способов итеративного решения проблемы Ханойской башни на языке C путем инициализации стеков:
-
Определите структуру для представления узла стека:
struct StackNode { int disk; struct StackNode* next; }; -
Реализовать операции со стеком:
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; } -
Реализовать итеративное решение Ханойской башни с помощью стеков:
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отвечает за перемещение дисков между стеками и печать шагов перемещения.