非递归汉诺塔问题

#include <bits/stdc++.h>
using namespace std;
struct _move {
   
    int n; //当前要移动的盘子编号
    int u; //上方还有几个盘子
    char s, m, d;//起始塔,中间塔,目的塔
    _move(int n1, int u1, char s1, char m1, char d1) : n(n1), u(u1), s(s1), m(m1), d(d1) {
   }
};
void honoi(int n, char a, char b, char c)
{
   
    if (n <= 0)
        return;
    stack<_move> _stk;
    _stk.push(_move(n, n - 1, a, b, c));
    
    while (!_stk.empty()) {
   
        _move m = _stk.top();
        _stk.pop();
        if (m.u == 0)
            printf("%c -> %c\n", m.s, m.d);
            //可以直接移动
        else {
   
            //先对n上方的盘子进行操作,然后再对n进行移动操作
            //因为栈是先进后出,所以这个操作的顺序也是反过来的
            _stk.push(_move(m.n - 1, m.u - 1, m.m, m.s, m.d));//将n的上一个盘子从中间塔移动到目的塔
            _stk.push(_move(m.n, 0, m.s, m.m, m.d));//移动n
            _stk.push(_move(m.n - 1, m.u - 1, m.s, m.d, m.m));//n的上一个盘子移动到中间塔
        }
    }
}
int main() {
   
#ifndef ONLINE_JUDGE
    freopen("D:/VS CODE/C++/in.txt", "r", stdin);
    freopen("D:/VS CODE/C++/out.txt", "w", stdout);
#endif

    int n;
    cin >> n;
    honoi(n, 'a', 'b', 'c');



    fclose(stdin);
    fclose(stdout);
    return 0;
}