用栈代替递归-汉诺塔问题(算法基础 第3周)

用栈代替递归

问题讲解:
用栈代替递归-汉诺塔问题(算法基础 第3周)_第1张图片
用栈代替递归-汉诺塔问题(算法基础 第3周)_第2张图片
用栈代替递归-汉诺塔问题(算法基础 第3周)_第3张图片
源码:

#include 
#include 
using namespace std;

struct Problem {
    int n;
    char src, mid, dest;
    Problem(int nn, char s, char m, char d):n(nn),src(s),mid(m),dest(d) { }
};  //一个Problem变量代表一个子问题,将src上的n个盘子,以mid为中介,移动到dest

stack stk;  
//用来模拟信封堆的栈,一个元素代表一个信封;若有n个盘子,则栈的高度不会超过n*3;

int main() {
    int n; 
    cin >> n;
    stk.push(Problem(n, 'A', 'B', 'C'));  //初始化了第一个信封
    while(!stk.empty()) {  //只要还有信封,就继续处理
        Problem curPrb = stk.top();  //取最上面的信封,即当前问题
        stk.pop();  //丢弃最上面的信封
        if (curPrb.n==1)
            cout << curPrb.src << "->" << curPrb.dest << endl;
        else {  //分解子问题
            //先把分解得到的第3个子问题放入栈中
            stk.push(Problem(curPrb.n-1, curPrb.mid, curPrb.src, curPrb.dest));
            //再把第2个子问题放入栈中
            stk.push(Problem(1, curPrb.src, curPrb.mid, curPrb.dest));
            //最后放第1个子问题,后放入栈的子问题先别处理
            stk.push(Problem(curPrb.n-1, curPrb.src, curPrb.dest, curPrb.mid));
        }
    }
    return 0;
}
























/*
//汉诺塔问题递归解法
#include 
using namespace std;

//将src座上的n个盘子,以mid座为中转,移动到dest座
void Hanoi(int n, char src, char mid, char dest) {
    if (n==1) {  //只需移动一个盘子
        cout << src << "->" << dest << endl;   //直接将盘子从src移动到dest即可
        return ;  //递归终止
    }
    Hanoi(n-1, src, dest, mid);  //先将n-1个盘子从src移动到mid
    cout << src << "->" << dest << endl;  //再将一个盘子从src移动到dest
    Hanoi(n-1, mid, src, dest);   //最后将n-1个盘子从mid移动到dest
    return ;
}

int main() {
    int n;
    cin >> n;   //输入盘子数目
    Hanoi(n, 'A', 'B', 'C');
    return 0;
}
*/

你可能感兴趣的:(程序设计与算法)