Нерекурсивное решение. Стек в виде массива

#define DEEP 20 // Максимальная глубина стека

void hanoi(short a, // Исходная площадка

short b, // Площадка - цель

short n){ // Число дисков

short stack[DEEP][3],

i, // Индикатор уровня стека

fl; // 0 – стек пуст. Конец вычислений

fl = 1;

i = -1;

while(fl){

if(n > 1){ // Заполнение стека

i++;

stack[ i ][0] = a;

stack[ i ][1] = b;

stack[ i ][2] = n;


/* Подготовить первое обращение */

b = 6-a-b;

n--;

}else{

if(i >= 0){// Стек не пуст

/* Печать вершины уровня 1 */

printf(" %2d %2d\n", a, b);

/* Извлечь данные из стека */

a = stack[ i ][0];

b = stack[ i ][1];

n = stack[ i ][2];

/* Печать "корня" */

printf(" %2d %2d\n", a, b);

/* Подготовить второе обращение */

a = 6-a-b;

n--;

/* Убрать вершину из стека */

i--;

}else{ // Стек пуст

fl = 0;

}

}

} // End while

/* Печать последней вершины */

printf(" %2d %2d\n", a, b);

} // End hanoi