如題,直接上代碼,註釋寫的很全了
非遞歸還是用棧實現
/*包含頭文件*/
#include <stdio.h>
#define MAXSIZE 60
/*函數聲明*/
void Hanoi1(int n, char a, char b, char c);
void Hanoi2(int n, char a, char b, char c);
void PrintHanoi(int no, char from, char to);
typedef struct
{
char a,b,c;
int flag,num;
}stack;
int main()
{
int n;
printf("請輸入移動圓盤的個數:\n");
scanf("%d",&n);
printf("漢諾塔的遞歸實現:\n");
Hanoi1(n,'a','b','c');
printf("漢諾塔的非遞歸實現:\n");
Hanoi2(n,'a','b','c');
return 0;
}
void PrintHanoi(int no, char from, char to)//輸出漢諾塔的圓盤移動過程
{
printf("將第%d個圓盤從%c移動到%c\n",no,from,to);
}
void Hanoi1(int n, char a, char b, char c)
{
if (n==1) PrintHanoi(n,a,c);
else
{
Hanoi1(n-1,a,c,b);
PrintHanoi(n,a,c);
Hanoi1(n-1,b,a,c);
}
}
void Hanoi2(int n, char a, char b, char c)
{
int top=1,a1,b1,c1,m;
stack s[MAXSIZE];
//初值入棧
s[top].num=n;
s[top].flag=1;
s[top].a=a;
s[top].b=b;
s[top].c=c;
while(top>0)
{
if (s[top].flag==1)
{
//退棧hanoi(n,a,b,c),相當於在遞歸函數中將實參傳給形參
m=s[top].num;
a1=s[top].a;
b1=s[top].b;
c1=s[top].c;
top--;
/*將hanoi(n-1,a,b,c)入棧,相當於在遞歸函數中的第一個遞歸調用函數,
將編號爲1~n-1的圓盤從塔座a移動到b,c作爲輔助塔座*/
top++;
s[top].num=m-1;
s[top].flag=1;
s[top].a=b1;
s[top].b=a1;
s[top].c=c1;
//將第n個圓盤從a移動到c
top++;
s[top].num=m;
s[top].flag=0;
s[top].a=a1;
s[top].c=c1;
/*將hanoi(n-1,b,a,c)入棧,相當於在遞歸函數中的第一個遞歸調用函數,
將編號爲1~n-1的圓盤從塔座b移動到c,a作爲輔助塔座*/
top++;
s[top].num=m-1;
s[top].flag=1;
s[top].a=a1;
s[top].b=c1;
s[top].c=b1;
}
while(top>0&&(s[top].flag==0||s[top].num==1))
{
if(top>0)//將第n個圓盤從a移動到c,並退棧
{
PrintHanoi(s[top].num,s[top].a,s[top].c);
top--;
}
}
}
}