应天论坛

 找回密码
 参与我们

QQ登录

只需一步,快速开始

搜索
查看: 705|回复: 0

不用递归实现汉诺塔,堆栈模拟递归

[复制链接]

276

主题

303

帖子

3187

积分

管理员

湘南小侠客

Rank: 9Rank: 9Rank: 9

积分
3187

优质服务勋章论坛元老

QQ
发表于 2017-5-27 19:05:24 | 显示全部楼层 |阅读模式
不用递归实现汉诺塔,堆栈模拟递归

[mw_shl_code=cpp,true]#include <stdio.h>
#include <math.h>
#include <malloc.h>

typedef struct MyStruct
{
        int i;
        char A;
        char B;
        char C;
}cs, *Pcs;

void mov(int i, char A, char B, char C);
void mov_stack(int i, char A, char B, char C);

int main()
{
        int cou = 0;
        printf_s("Please Input a number:");
        scanf_s("%d", &cou);
        printf_s("递归:\n");
        mov(cou, 'A', 'B', 'C');
        printf_s("stack:\n");
        mov_stack(cou, 'A', 'B', 'C');
        return 0;
}

void mov(int i, char A, char B, char C)
{
        if (i == 1)
                printf_s("%c->%c\n", A, C);
        else
        {
                mov(i - 1, A, C, B);
                printf_s("%c->%c\n", A, C);
                mov(i - 1, B, A, C);
        }
}

void mov_stack(int n, char A, char B, char C)
{
        int sum = (int)pow(2.0, (double)n);
        // 计算次数 (-1没减)
        Pcs stack = (Pcs)malloc(sizeof(cs) * sum);
        //分配堆栈空间
        int index = 0;
        //堆栈初始化
        stack[index].i = n;
        stack[index].A = A;
        stack[index].B = B;
        stack[index].C = C;
        index++;
        //push
        while (index)
        {
                if (stack[index - 1].i > 1)
                {
                        stack[index].i = stack[index - 1].i - 1;
                        stack[index].A = stack[index - 1].A;
                        stack[index].B = stack[index - 1].C;
                        stack[index].C = stack[index - 1].B;
                        index++;
                        //if(i>1) push
                }
                else
                {
                        printf_s("%c->%c\n", stack[index - 1].A, stack[index - 1].C);
                        //if(i==1) show
                        index--;
                        //pop
                        if (!index)
                                break;
                        if (stack[index - 1].i == stack[index - 2].i)// 是否为第二个
                        {
                                while (index && stack[index - 1].i == stack[index - 2].i)//pop
                                        index -= 2;
                                if (!index)
                                        break;
                        }

                        printf_s("%c->%c\n", stack[index - 1].A, stack[index - 1].C);
                        //show  两个函数之间的那句
                        
                        stack[index].i = stack[index - 1].i;
                        stack[index].A = stack[index - 1].B;
                        stack[index].B = stack[index - 1].C;
                        stack[index].C = stack[index - 1].A;
                        index++;
                        /*
                        push
                        因为
                        A B C
                        B A C
                        所以
                        A C B
                        B C A
                        */
                }
        }}[/mw_shl_code]
每次见你穿短裤打领带,还穿个拖鞋,下次再这样穿不要从我家门口过了!
http://gsh.yzqz.cn/CassettePlayer/index.html

天之道,损有余而补不足.人之道则不然,损不足以奉有余.孰能有余以奉天下,唯有道者.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 参与我们

本版积分规则

QQ|Archiver|手机版|小黑屋|应天社区 ( 湘ICP备17015224号 )

GMT+8, 2024-4-26 08:11 , Processed in 0.593735 second(s), 30 queries .

Powered by Discuz!

© 2001-2017 Comsenz Inc.


免责声明:
本站所发布的第三方软件及资源(包括但不仅限于文字/图片/音频/视频等仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢某程序或某个资源,请支持正版软件及版权方利益,注册或购买,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To: admin@yzqz.cn

快速回复 返回顶部 返回列表