汉诺塔非递归算法分析与实现

汉诺塔的递归算法很容易理解,也非常容易实现。下面,本文讨论了汉诺塔问题的非递归算法,核心内容就是栈的使用技巧。
首先,对于每个柱子来说,就是一个栈,这个栈有个特点就是,大数放在下面,小数放在上面。在首次建立栈时,我们可以先存储好这些数据,假设最小的盘子序号为1,后面的由此类推。在建立栈时,根据当前盘子总数是否为偶数,需要调整B、C两个柱子的位置。当n为偶数时,按照A、B、C的顺序排放三个柱子,当n为奇数时,按照A、C、B的顺序排列这些柱子。这两个顺序就是汉诺塔中最小的那个盘子的挪动顺序。
其次,建立好栈后,接下来就是算法的核心部分了。初始情况下,需要首先挪动最小的那个盘子,把编号为1的那个盘子挪动到它的下一个位置上(有可能是B,也有可能是C),这时需要判断一下,程序是否已经完成了,若还没有完成,则继续下面的步骤。下一步,判断当前剩下的两个柱子的栈顶元素,如果有个栈顶元素为0,说明该柱子上没有盘子,把非零的栈顶元素放入空栈中;如果两个栈顶元素都是非零的,则将较小的元素移动到较大的元素上面。
再次,此时一轮循环已经结束,再次移动编号为1的盘子,将它移动到它的下一个位置上面。
最后,重复上面的步骤,当循环结束时,我们的算法就运行完了。

// NonRecursionHanoi.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include<iostream>

using namespace std;

const int MAX = 64;

struct st
{
    char name;
    int array[MAX];
    int topIndex;

    int TopData( void )
    {
        if( topIndex == 0 )
        {
            return 0;
        }
        
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值