能帮我看下这个程序吗?

来源:百度知道 编辑:UC知道 时间:2024/06/10 16:15:53
以下C++程序能实现:当我输入abcdefg# 会输出gfedcba.
可是我实在看不懂,能详细解释下吗?
#include <iostream>
#include <stdlib.h>

using namespace std;
void stack(char c);
int main(int argc, char *argv[])
{

char d;
cin>>d;
stack(d);
cout<<endl;
system("PAUSE");
return 0;
}
void stack(char c)
{
if(c!='#')
{
char d;
cin>>d;
stack(d);
cout<<c;
return;
}
else
{
return;
}
}

理解下stack函数就知道干什么了,首先这是个递归调用 (是一种特殊的嵌套调用,是函数调用自己,而不是另外一个函数)。
输入a ,传递到stack(a), a!=# -> 输入b,调用stack(b) , b!=# -> ... -> 输入g 调用stack(g) ,g!=# -> 输入# 调用stack(#) ,#=# 条件成立退出stack(#)

->接着执行 stack(g) 即 输出g ->接着执行 stack(f) 即 输出f ->...->接着执行 stack(a) 即 输出a

就好象一个栈 进stack(a)stack(b)...stack(g)stack(#) 出stack(#)stack(g)stack(f)...stack(a)
所以整个过程输入abcdefg#后得到的是gfedcba

关键在于:
函数stack,递归调用了自身
它把输入的内容,在递归调用的时候,都压到系统的堆栈里面
出栈后输出,刚好是反序的

这段程序的作用是将输入的字符串逆序输出,主程序main中,将输入的字符装入d中,然后将d交给子程序stack处理。stack的作用是先判断是否遇到字符串结束标志#,若遇到则返回,未遇到则将当前字符放入d中,再调用自身将d的值做为新的C传递。当遇到#后就按递归顺序将C中的字串输出。
这样用递归的方法实现输入字符串的逆序输出,充分利用了变量的作用域达到一个变量多次重复利用的目的。

我觉得这个程序很有意思,是这么一回事,总体思想是采用递归调用。
先让你输入一个字符,保存到d,然后调用自身,再让你输入一个字符,再保存到d,注意,现在的d和开始的d已经不一样了,d代表内存的另外一块区域,因为从新调用了自己,也就是说调用了一个新函数。然后接着调用自己一直到输入#,一旦输入#则调用结束,然后调用者执行cout<<c.就把你最后输入的字符打印出来了,然后一直到退回去,依次反向打印出你输入的字符