串
串的定義
串的邏輯結構和線性表極爲相似,區別僅在於串的數據對象約束爲字符集。然而,串的基本操作和線性表有很大差別。在線性表的基本操作中,大多以單個元素作爲操作對象,列入,在線性表中查找某個元素,求取某個元素,在某個位置上插入一個元素或刪除一個元素等;而在串的基本操作中,通常以串的整體作爲操作對象,例如,在串中查找某個子串,求取一個子串,在串的某個位置上插入一個子串,以及刪除一個子串等。
串的存儲結構
串的順序存儲
第一種
//-----串的定長順序存儲結構-----
#define MAXLEN 255 //串的最大長度
typedef struct{
char ch[MAXLEN+1]; //存儲串的一維數組
int length; //串的當前長度
}SString;
這種定義方式是靜態的,在編譯時就確定也串空間的大小。
第二種
//------串的堆式存儲結構------
typedef struct{
char *ch; //若是非空串,則按串長分配存儲區,否則ch爲NULL
int length; //串的當前長度
}HString;
這種方式是動態的,能夠根據實際情況動態地分配和釋放數組空間。
串的鏈式存儲結構
//------串的鏈式存儲結構------
#define CHUNKSIZE 80 //可由用戶定義的塊大小
typedef struct Chunk{
char ch[CHUNKSIZE];
struct Chunk *next;
}Chunk;
typedef struct{
Chunk *head,*tail; //串的頭尾指針
int length; //串的當前長度
}LString;
串值得鏈式存儲結構對某些串操作,如鏈接操作等,有一定的方便之處,但總的說來,不如順序存儲結構靈活,它佔用存儲量大且操作複雜。此外,串值再鏈式存儲結構時,串操作的實現和線性表在鏈表存儲結構中的操作類似。
串的模式匹配算法——BF算法
子串定位運算通常稱爲串的模式匹配或串匹配。此運算的應用非常廣泛,比如在搜索引擎、拼寫檢查、語言翻譯、數據壓縮等應用中,都需要進行串匹配。串的模式匹配設有兩個字符串S和T,S爲主串也成爲正文串,T爲子串也叫作模式,在主串S中查找與模式T相匹配的子串,如果匹配成功,確定相匹配的子串中的第一個字符出現在S串中的位置。
最簡單直觀的模式匹配算法是BF(Brute-Force)算法。
匹配步驟圖如下:
算法描述
int Index_BF(SString S,SString T,int pos){
int i=pos,j=1;//初始化,pos爲主串中開始搜索的位置,一般爲1
while(i<=S.length&&j<=L.length){ //條件爲兩個串都未比較到串尾
if(S.ch[i]==T.ch[j]){
i++;j++; //元素相同繼續比較下一個
}
else{
i=i-j+2;j=1 //指針回溯
}
if(j>T.length) return i-T.length; //匹配成功
else return 0; //匹配失敗
}
}
參考自《數據結構》嚴蔚敏