数据结构—字符串
總第118篇
前言
本篇開始寫數據結構的第三部分——字符串,主要內容如下:
概念
串的存儲結構
串的基本操作
關于字符串還有一個重要的知識點是KMP模式匹配算法,關于這個算法會單獨拿一篇來寫。
概念
串是由零個或多個字符組成的有限序列,又叫字符串。串中字符的個數稱為串的長度,含有零個元素的串叫空串,空格也屬于一個元素,只有空格的串稱為空格串,空格串不等于空串。
在C語言中,可以用如下語句來定義一個名為str的字符串。
char?str[]?=?"abcdef";串通常用一個字符數組表示,數組str內存儲的字符為"a","b","c","d","e","f","\0",其中"\0"作為編譯器識別串結束標記,不算實際字符,因此數組str的長度為7,串str的長度為6。
串中任意連續字符組成的子序列稱為該串的子串,包含子串的串稱為主串,某個字符在串中的序號稱為這個字符的位置。
串的存儲結構
1.定長順序存儲
定長順序存儲就是事先指定串的長度并分配存儲空間,定義如下:
typedef?struct {char?str[maxsize+1];int?length;????//字符串長度 }Str;maxsize表示串的最大長度,maxsize+1表示字符數組的長度,多出來的一個長度是用來存儲\0標識符的。
2.變長分配存儲
變長分配存儲是在程序執行過程中根據需要動態分配串的長度以及空間,定義如下:
typedef?struct {char?*ch;????????//指向動態分配存儲區首地址的字符指針int?length;?????//串長度 }Str;這種存儲方式在使用時需要用函數malloc()來分配一個長度為length、類型為char型的連續存儲空間。用函數malloc()分配存儲空間,如果成功,則返回一個指向起始地址的指針,作為串的基地址,這個地址由ch指針指向。
串的基本操作
1.賦值操作
因為串是一個數組,不可以直接進行賦值,需要對數組中的每個元素進行逐一賦值操作。
int?strassign(Str&?str,char*?ch) {if(str.ch)free(str.ch);????//釋放int?len?=?0;char?*c?=?ch;while(*c)????????????//求串ch的長度{++len;??????????//字符串長度+1++c;?????????????//指針向后移動1}if(len?==?0)??????//如果ch串長度為0,即為空串,直接返回空串{str.ch?=?NULL;str.length?=?0;return?1;}else{str.ch?=?(char*)malloc(sizeof(char)*(len+1));????//動態分配存儲,如果分配成功則返回具體指針,負責返回0if(str.ch?==?NULL)???????????????//分配失敗return?0;else{c?=?chfor?(int?i?=?0;i?<=?len;++i,++c)????//將ch最后的"\0"一起賦值給新串作為結尾標記符str.ch[i]?=?*c;str.length?=?len;return?1;}} }2.取串長度操作
如果字符串數組給出了串的長度,取字符串的長度就比較簡單,直接調用str.length即可,具體代碼如下:
int?strlength(Str?str) {return?str.length }如果字符串數組沒有給出串的長度,那么直接去遍歷字符串中每個元素,依次將length加1,最后就是字符串長度,具體代碼如下:
????int?len?=?0;char?*c?=?ch;while(*c)????????????//求串ch的長度{++len;??????????//字符串長度+1++c;?????????????//指針向后移動1}3.串比較操作
兩個字符串比較,對于等長的兩個字符串依次將兩個字符串中的每一個對應的數據元素去做對比,比較數據元素的ASCII碼值。對于不等長的字符串,字符串較短的串比較小。
int?strcompare(Str?s1,Str?s2) {for(int?i?=?0;i?<?s1.length?&&?i?<?s2.length)if(s1.ch[i]?!=?s2.ch[i])return?s1.ch[i]?-?s2.ch[2];return?s1.length?-?s2.length }4.串連接操作
串鏈接就是將兩個字符串首尾進行鏈接,合并成一個新的字符串,其實具體的賦值原理就是分別將倆個串以先后順序賦值給同一個新串。具體實現代碼如下:
int?concat(Str&?str,Str?str1,Str?str2) {if(str.ch){free(str.ch);????//釋放原串空間str.ch?=?NULL;}str.ch?=?(char*)?malloc?(sizeof(char)*(str1.length?+?str2.length?+?1));if(str.ch?==?NULL)return?0;int?i?=?0;while(i?<?str1.length){str.ch[i]?=?str1.ch[i];++i;}int?j?=?0;while(j?<=?str2.length){str.ch[i?+?j]?=?str2.ch[j];++j;}str.length?=?str1.length?+?str2.length;return?1; }5.求子串操作
求從某一位置開始,另一位置結束的串的操作稱為求子串操作。現在要從字符串str中的pos位置開始,獲取長度為len的子串,子串由substr返回。具體代碼如下:
int?substring(Str&?substr,Str?str,int?pos,int?len) {if(pos)?<?0?||?pos?>=?str.length?||?len?<?0?||?len?>?str.length?-?pos??//如果開始位置小于0或開始位置大于字符串長度或子串//長度小于0或子串長度大于總字符串長度-開始位置return?0;if(substr.ch){free(substr.ch);substr.ch?=?NULL;}if(len)?=?0{substr.ch?=?NULL;substr.length?=?0;return?1;}else{substr.ch?=?(char*)malloc(sizeof(char)*len+1);int?i?=?pos;int?j?=0;while(i?<?pos?+?len){substr.ch[j]?=?str.ch[]i];++i;++j;}substr.ch[j]?=?"\0"substr.length?=?len;return?1;} }6.串清空操作
串清空就是將字符串中的元素全部刪除,具體代碼如下:
int?clearstring(Str&?str) {if(str.ch){free(str.ch);str.ch?=?NULL;}str.length?=?0;return?1; }關于字符串的操作,在Python中就比較簡單了,很多方法都有現成的函數,可以供你直接使用。
你還可以看:
數據結構—線性表
數據結構-棧和隊列
總結
- 上一篇: 00后男生取名江胡传奇:妈妈姓胡 爸爸喜
- 下一篇: 送书!送书!送书!