資料結構中的字串字串bf演算法(普通模式匹配演算法)
資料結構中提到的串,即字串,由 n 個字元組成的乙個整體( n >= 0
)。這 n 個字元可以由字母、數字或者其他字元組成。
例如,s =」beijing」 ,s 代表這個串的串名,beijing 是串的值。
雙引號不是串的值,作用只是為了將串和其他結構區分開。
特殊的串
空串:含有零個字元的串。例如:s =「」(雙引號中沒有任何東西),一般直接用 ø 表示。
空格串:只包含空格的串。注意和空串區分開,空格串中是有內容的,只不過包含的是空格,且空格串中可以包含多個空格。例如,a =」 」(包含3個空格)。
子串與主串:串中任意個連續字元組成的字串叫做該串的子串,包含子串的串稱為主串。
例如:a = 」bei」,b = 」beijing」,c =」bjingei」 。對於字串 a 和 b 來說,由於 b 中含有連續的字串 a ,所以可以稱 a 是 b 的子串,b 是 a 的主串;而對於 c 和 a ,雖然 c 中也含有 a 的全部字元,但不是連續的 「bei」 ,所以串 c 和 a 沒有任何關係。
子串在主串中的位置:對於串 a = 」bei」 來說,首字元 『b』 在串 b 的位置為 1 ,所以子串 a 在主串 b = 「beijing」 中的位置是 1
。子串在主串中的位置和字元在陣列中的存放位置不同,子串在主串的位置從
1開始數。
兩個串相等的標準:如果兩個串的串值完全相同,那麼這兩個串相等。
串的三種儲存結構
儲存串的結構有三種:
1 定長順序儲存;2 堆分配儲存; 3
塊鏈儲存。
定長順序儲存
採用固定長度的陣列(即靜態陣列)儲存串。
例如:char a[7] = "
abcdfg";
此方式儲存串時,需要預估串的長度提前申請足夠的儲存空間。目標串如果超過了陣列申請的長度,超出部分會被自動捨棄(稱為「截斷」)。
例如:char a[3] = "
abcdfg
"; //
實際上陣列中只儲存了 「ab」 ,後邊的被截斷。
堆分配儲存
採用動態陣列儲存串。
在c語言中,存在著乙個被稱之為「堆」的自由儲存區,用
malloc 函式和 free 函式管理,malloc 函式負責申請空間,free
函式負責釋放空間。
例如:char * a = (char*)malloc(5*sizeof(char));//
建立 a 陣列,動態申請5個 char 型別資料的儲存空間
使用堆分配儲存的優勢在於:當發現申請的空間不夠用時,可以通過
realloc
() 函式重新申請更大的儲存空間。
例如:a = (char*)realloc(a, 10*sizeof(char));//
前乙個引數指申請空間的物件;第二個引數,重新申請空間的大小
使用 malloc 函式申請的儲存空間,不會自動釋放,需要程式設計師呼叫 free
() 函式手動釋放。如果不手動釋放,當程式執行徹底結束,由作業系統進行**。
例如:free(a);//
釋放動態陣列a申請的空間
舉乙個完整的例子,連線串 「abc」 和 「defg」 變為 「abcdefg」 ;
#include
#include
#include
intmain()
for (int i=lengtha1; i)
printf("%s
", a1);
free
(a1);
free
(a2);
return0;
}輸出結果:
abcdefg
注:在程式中,我們給 a1 和 a2 賦值的時候,使用了 strcpy 複製函式。在這裡不能直接用:a1 = 」abc」這種方式,如果你這樣做,程式編譯會出錯,告訴你,沒有 malloc 的空間不能 free
。原因是: strcpy 函式是將字串複製到申請的儲存空間中,而直接賦值是字串儲存在別的記憶體空間(本身是乙個常量,放在常量區)中,更改了指標 a1 和 a2 的指向,也就是說,之前動態申請的儲存空間雖然申請了,結果還沒用呢就丟了。
塊鏈儲存
塊鏈儲存,其實就是借用鍊錶的儲存結構來儲存串。一般情況下使用單鏈表就足夠了,而且不需要增設頭結點。
在構建鍊錶時,每個結點可以存放乙個字元,也可以存放多個字元。
圖1 塊鏈儲存
鍊錶中最後乙個結點的資料域不一定全被串值佔滿,通常會補上 「#」 或者其他特殊的字元和字串中的字元區分開。
每個結點設定字元數量的多少和儲存的串的長度、可以占用的儲存空間以及程式實現的功能相關。
如果串包含資料量很大,但是可用的儲存空間有限,那麼就需要提高空間利用率,相應地減少結點數量(因為多乙個節點,就多申請乙個指標域的空間)。
而如果程式中需要大量地插入或者刪除資料,如果每個節點包含的字元過多,操作字元就會變得很麻煩,為實現功能增加了障礙。
總結在平時編寫程式,經常會用到例如:
char *a =」abcd」;這種方式表示字串,和上面三種儲存方式最主要的區別是:這種方式用於表示常量字串,只能使用,不能對字串內容做修改(否則程式執行出錯);而以上三種方式都可以對字串進行刪改的操作。
例如:#include
intmain()
程式編譯可以通過,執行失敗,改成下面堆分配儲存的方式就對了:
#include
#include
#include
intmain()
輸出結果:
aecd
三種儲存表示方式中,最常用的是堆分配儲存,因為它在定長儲存的基礎上通過使用動態陣列,避免了在操作串時可能因為申請儲存空間的不足而丟失字元資料;
和塊鏈儲存方式相比,結構相對簡單,更容易操作。
資料結構 字串
1 字串 include string.h include stdio.h include stdlib.h include math.h include time.h define ok 1 define error 0 define true 1 define false 0 define ma...
資料結構 字串
字串是由0個或多個字元構成的序列,可記為s a1a2a3 an 其中ai可以是字母,也可是數字或者其他字元,零個字元的串稱為空串。而字串的順序結構就是用簡單的char型別陣列來儲存沒什麼好說的,下面介紹一下bf演算法與kmp演算法 bf演算法就是比較平常的雙重迴圈,如果匹配成功打斷迴圈,否則子串的比...
資料結構 字串
靜態陣列實現 順序儲存 串的順序儲存 define maxlen 255 預定義最大串長為255 typedef struct 靜態陣列實現 順序儲存 sstring 動態陣列實現 堆分配儲存 typedef struct 動態陣列實現 堆分配儲存 hstring 初始化void inithstri...