通過遞迴的方式將字串逆置列印

2022-08-30 23:57:31 字數 1900 閱讀 1233

逆置列印字串是有很多種方法的,個人感覺使用遞迴的方式很可以很容易的去理解棧的建立與析構,所以就稍微建立了模型;

首先我們先看看理論:

遞迴模型:

1. 遞迴模型即是對自己本身的呼叫,一般用在函式或子函式函式的內部;

2. 每呼叫一次函式,編譯器就會分配另乙個棧或堆空間;

3. 當遇到終止條件時就開始析構函式(必須有終止條件,否則會無限分配空間記憶體,導致記憶體空間溢位,從而導致宕機);

有乙個字串"abcde",我們要將它逆置列印,也就是輸出edcba,這裡我們先用乙個簡單點的方法,通過陣列的下標來列印,即將資料copy到乙個陣列中(陣列足夠大),直接將下標移到最後的位置,乙個乙個的往前列印;

如下:

1

#define _crt_secure_no_warnings

2 #include 3 #include

4 #include 567

void

main()

8; //

一維陣列並初始化為空,防止出現亂碼

12int len = 0; //

計算資料長度

13int i = 0; //

for迴圈列印資料

14 strcpy(p,str); //

將資料copy到陣列中

15 len = strlen(str) - 1; //

算出字串的長度因為,下標是從0開始,所以減一

1617

for(i = len ; i >= 0; i--)//

直接通過下標逆置

1821 system("

pause");

22return;23

2425 }

這個應該很容易看懂,所以我就不多做解釋了,也可以通過指標來讀取資料,在建立乙個輔助指標變數,因為str指向字串首位址,所以將新建的指標指向末位址,然後就和列印陣列一樣,乙個乙個的往後移,或者是直接逆置copy到乙個陣列中等等(切記,「abcde」是字串常量,它擁有唯讀屬性,也就是說不能修改它所在的記憶體空間只能讀取資料);

1

#define _crt_secure_no_warnings

2 #include 3 #include

4 #include 5

6int inversion(char *p);//接受的是位址7

8int

main()917

18int inversion(char *p)

1925 str = p;//

將p所指向的位址賦給str

26 inversion(p+1);//

因為引數是指標所以將位址賦給它

27 printf("

%c",*str);

28return0;

29 }

這裡一定要記住一點,呼叫函式時inversion時,呼叫它的棧是不會被析構掉的,而通過它則建立了乙個新的棧空間,除非一整個函式體執行或者遇到終止命令,不然不會被析構掉,也就是說每建立乙個新的棧區,從中分配str和p已經和上乙個棧區的變數沒有關係了。也就是說str每次指向的都是新傳遞過來的位址,圖如下:

其實因為我們傳遞過去的是乙個字串常量,所以我們在寫函式引數是可以這樣寫int inversion(const char *p);宣告一下我這個是唯讀常量,或者說用const修飾告訴別人

不允許修改我這個指標所指向的空間資料;其實在c中const是有歧義的,這個在之前的c++中的const和c中的區別我稍微寫過一點,因該是c++中對於const進行了功能加強。

字串逆置(遞迴和非遞迴)

單鏈表逆置 遞迴 要時時刻刻記著,我們要返回的是當前鍊錶的尾結點,這樣的話if和else中的內容就很清楚了。逆置單鏈表,返回原單鏈表的尾結點。linklist reverserecursive linklist l return reversehead 單鏈表逆置 非遞迴 根據劍指offer上的講述...

python字串逆置 字串逆置演算法

1,輸人 字串 123456 輸出 654321 注意 字元陣列不等於字串,只有當字元陣列結尾加上結束標誌 0 才是字串。所以字串用字元陣列來初始化時,結尾必須加上 0 比如 初始化字串 char ch 7 如下 include include include define maxsize 100 ...

字串逆置

題目描述 字串 i am a student 逆置為 student a am i 思路 第一次逆置 先將整個字串都逆置 tneduts a ma i 第二次逆置再將每個單詞逆置 student a am i 利用空格找出乙個單詞進行逆置 public class testdemo2 public ...