#include
void reverse(const char* const sptr);
int main()
{
char sentence[200];
printf("請輸入一行文字:\n");
gets(sentence);
printf("\n反轉的字串式:\n");
reverse(sentence);
getchar();
return(0);
}
void reverse(const char* const sptr){
if(sptr[0]=='\0'){
return;
}else{
reverse(&sptr[1]);
putchar(sptr[0]);
}
}
reverse(&sptr[1]);
putchar(sptr[0]); --->>這兩行不太懂!!
原本想這程式顯示的方法是不是用堆疊原理!!
如果是堆疊的話 那為甚麼要將&sptr[1]的位址取出
請大大幫我詳細說明一下好嗎?? 謝啦
2007-09-09 08:05:46 · 1 個解答 · 發問者 龐老六 3 in 電腦與網際網路 ➔ 程式設計
是不是運用堆疊?答案:是的,沒有錯。
遞迴(Recursive):「自己」呼叫「自己」的函式。
reverse 函式就是一個遞迴函式,而遞迴就是運用堆疊。
假設 sentence [ 200 ] = " ABCDEFG "
因為字串的結尾有一個結束字元「\0」,所以整個字串的長度應為 8(個字元)。
當第一次進入 reverse 函式時…
進入 else:取出 sptr [ 1 ] 字元與它後面的字串,並且把 sptr [ 1 ] 為開頭的字串,再次放入 reverse 函式,sptr [ 0 ] = A 字元則堆疊在記憶體內。這時,進入第二次的 reverse 函式會把這個 sptr [ 1 ] 字串的開頭,當成是 sptr [ 0 ],進入 else,把我們原先第一次認為是 sptr [ 2 ] 的字串,再次放入 reverse 函式,而我們原先第一次認為是 sptr [ 1 ] = B 的字元則堆疊在記憶體內。這樣下去……以此類推。
以下是堆疊的狀態…
堆疊:A
堆疊:AB
堆疊:ABC
堆疊:ABCD
堆疊:ABCDE
堆疊:ABCDEF
堆疊:ABCDEFG
當 if 讀到結束字元「\0」時,回傳無效值,並跳出這個讀到「\0」字串的 reverse 函式。
以下是堆疊的狀態…
堆疊:ABCDEFG
顯示:putchar( ' G ' );
堆疊:ABCDEF
顯示:putchar( ' F ' );
堆疊:ABCDE
顯示:putchar( ' E ' );
堆疊:ABCD
顯示:putchar( ' D ' );
堆疊:ABC
顯示:putchar( ' C ' );
堆疊:AB
顯示:putchar( ' B ' );
堆疊:A
顯示:putchar( ' A ' );
最後跳出 reverse 函式。
2007-09-09 12:42:49 · answer #1 · answered by Big_John-tw 7 · 0⤊ 0⤋