逆置列印字串是有很多種方法的,個人感覺使用遞迴的方式很可以很容易的去理解棧的建立與析構,所以就稍微建立了模型;
首先我們先看看理論:
遞迴模型:
1. 遞迴模型即是對自己本身的呼叫,一般用在函式或子函式函式的內部;
2. 每呼叫一次函式,編譯器就會分配另乙個棧或堆空間;
3. 當遇到終止條件時就開始析構函式(必須有終止條件,否則會無限分配空間記憶體,導致記憶體空間溢位,從而導致宕機);
有乙個字串"abcde",我們要將它逆置列印,也就是輸出edcba,這裡我們先用乙個簡單點的方法,通過陣列的下標來列印,即將資料copy到乙個陣列中(陣列足夠大),直接將下標移到最後的位置,乙個乙個的往前列印;
如下:
1這個應該很容易看懂,所以我就不多做解釋了,也可以通過指標來讀取資料,在建立乙個輔助指標變數,因為str指向字串首位址,所以將新建的指標指向末位址,然後就和列印陣列一樣,乙個乙個的往後移,或者是直接逆置copy到乙個陣列中等等(切記,「abcde」是字串常量,它擁有唯讀屬性,也就是說不能修改它所在的記憶體空間只能讀取資料);#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 }
1這裡一定要記住一點,呼叫函式時inversion時,呼叫它的棧是不會被析構掉的,而通過它則建立了乙個新的棧空間,除非一整個函式體執行或者遇到終止命令,不然不會被析構掉,也就是說每建立乙個新的棧區,從中分配str和p已經和上乙個棧區的變數沒有關係了。也就是說str每次指向的都是新傳遞過來的位址,圖如下:#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 }
其實因為我們傳遞過去的是乙個字串常量,所以我們在寫函式引數是可以這樣寫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 ...