很郁闷的一件事情,本来已经写好了,不只怎么网页跳走了,白写了
这就随便说下.
栈是有"先进后出"的原则,而嵌套函数也一样有一个原则是:'"后调用先返回"
这就和栈的进出相符合了.
这里拿Hanoi塔的问题来分析(不画图了,要看图的翻 数据结构的那本书看下)
//
下面是算法.
/* *************n阶Hanoi塔的问题******************** */
#include < stdio.h >
void hanoi( int n, char x, char y, char z)
{ // 将塔座x上按直径有小到大且自上而下编号为1至n的n个圆盘按规则搬动到
// 塔座z上,y塔座可以用做辅助move() // 搬动函数
if (n == 1 )
{
move(x, 1 ,z); // 当n==1时,则搬动x上的圆盘放到z上
}
else
{
hanoi(n - 1 ,x,z,y); // 将x上编号为1至n-1的圆盘移动到y,z做辅助塔
move(x,n,z); // 执行搬动操作
hanoi(n - 1 ,y,x,z); // 将y塔座上的编号为1至n-1的圆盘移动到z上,x做辅助塔
}
}
main()
{
int n, a, b, c;
...........
...........
hanoi(n,a,b,c);
}
/* *************n阶Hanoi塔的问题******************** */
#include < stdio.h >
void hanoi( int n, char x, char y, char z)
{ // 将塔座x上按直径有小到大且自上而下编号为1至n的n个圆盘按规则搬动到
// 塔座z上,y塔座可以用做辅助move() // 搬动函数
if (n == 1 )
{
move(x, 1 ,z); // 当n==1时,则搬动x上的圆盘放到z上
}
else
{
hanoi(n - 1 ,x,z,y); // 将x上编号为1至n-1的圆盘移动到y,z做辅助塔
move(x,n,z); // 执行搬动操作
hanoi(n - 1 ,y,x,z); // 将y塔座上的编号为1至n-1的圆盘移动到z上,x做辅助塔
}
}
main()
{
int n, a, b, c;
...........
...........
hanoi(n,a,b,c);
}
//
下面是分析.
/* *************n阶Hanoi塔的问题******************** */
#include < stdio.h >
void hanoi( int n, char a, char b, char c)
{ if (n == 1 )
{
move(x, 1 ,z); // 当n==1时,则搬动x上的圆盘放到z上
}
else
{
hanoi( 2 ,a,b,c); // 2层push(6,2,a,b,c)=====>>>>
{
void hanoi( int 2 , char a, char b, char c)
{
if (n == 1 ) move(a, 1 ,c); //
else
{
/* ************3层push(8,1,a,c,b)************* */
hanoi( 1 ,a,c,b);
====================>>>>>>>
void hanoi( int 1 , char a, char c, char b)
{
if (n == 1 )move(a, 1 ,b) // 符合n==1,执行完if下面就不执行了
} // 执行完,返回2层
/* ***********出栈pop(8,1,a,c,b)********************* */
move(a, 2 ,c); // 搬动第2个圆盘
/* **************进入3层push(8,1,b,a,c)***************** */
hanoi( 1 ,b,a,c)
======================>>>>
void hanoi( int 1 , char b, char a, char c)
{
if (n == 1 )move(b, 1 ,c); // 下面不执行了
}
/* **********返回2层,出栈pop(8,1,b,a,c)***************** */
}
}
} // 返回到1层,出栈pop(6,2,a,b,c)
move(x, 3 ,z); // 执行搬动操作
hanoi( 2 ,b,a,c); // 与上面进入2层操作是一样的。这里就不写了
}
}
main()
{
int n, a, b, c;
...........
...........
hanoi(n,a,b,c); // 1层push(0,3,a,b,c);
}
/* *************n阶Hanoi塔的问题******************** */
#include < stdio.h >
void hanoi( int n, char a, char b, char c)
{ if (n == 1 )
{
move(x, 1 ,z); // 当n==1时,则搬动x上的圆盘放到z上
}
else
{
hanoi( 2 ,a,b,c); // 2层push(6,2,a,b,c)=====>>>>
{
void hanoi( int 2 , char a, char b, char c)
{
if (n == 1 ) move(a, 1 ,c); //
else
{
/* ************3层push(8,1,a,c,b)************* */
hanoi( 1 ,a,c,b);
====================>>>>>>>
void hanoi( int 1 , char a, char c, char b)
{
if (n == 1 )move(a, 1 ,b) // 符合n==1,执行完if下面就不执行了
} // 执行完,返回2层
/* ***********出栈pop(8,1,a,c,b)********************* */
move(a, 2 ,c); // 搬动第2个圆盘
/* **************进入3层push(8,1,b,a,c)***************** */
hanoi( 1 ,b,a,c)
======================>>>>
void hanoi( int 1 , char b, char a, char c)
{
if (n == 1 )move(b, 1 ,c); // 下面不执行了
}
/* **********返回2层,出栈pop(8,1,b,a,c)***************** */
}
}
} // 返回到1层,出栈pop(6,2,a,b,c)
move(x, 3 ,z); // 执行搬动操作
hanoi( 2 ,b,a,c); // 与上面进入2层操作是一样的。这里就不写了
}
}
main()
{
int n, a, b, c;
...........
...........
hanoi(n,a,b,c); // 1层push(0,3,a,b,c);
}
程序不难的。主要是思想。
在这我把程序给补出来。由于现在手头没编译器,布局不好请大家鉴谅~
#include<stdio.h>
void hanoi(int n,char x,char y,char z);
void move(char one, char three);
void move(char one, char three)
{
printf("%c--->%c/n",one,three);
}
void hanoi(int n,char x, char y,char z)
{
if(n == 1)move(x,z);
else
{
hanoi(n-1,x,z,y);
move(x,z);
hanoi(n-1,y,x,z);
}
}
main()
{
int n;
printf("input n:"); /* n个盘*/
scanf("%d",&n);
hanoi(n,a,b,c); /*把a上的n个盘经b移动到c*/
return 0;
}
真正了解了之后就对栈有了个比较清楚的了解,明白栈与函数之间的关系