第一章 緒論
第二章 線性表
第三章 棧和佇列
第四章 串
第五章 陣列和廣義表
第六章 樹和二叉樹
第七章 圖
第八章 排序
第九章 查詢
4.2 串的儲存結構
4.2.2 鏈式儲存
4.3 模式匹配
4.4 例題
4.1.1 串的概念
串(string)是零個或多個字元組成的有限序列。一般記作s=「a1a2a3…an」,其中s是串名
,用雙引號括起來的字串行是串值
;ai(1≦i≦n)可以是字母、數字或其它字元。串中所包含的字元個數稱為該串的長度
。
(1)主串和子串
串中任意個連續字元組成的子串行稱為該串的子串。包含子串的串相應地稱為主串。
通常將子串在主串中首次出現時的該子串的首字元對應的主串中的序號,定義為子串在主串中的序號(或位置)。
(2)空白串和空串
長度為零的串稱為空串(empty string)
,它不包含任何字元。
通常將僅由乙個或多個空格組成的串稱為空白串(blank string)
。
空白串和空串的不同,如「 」和「」分別表示長度為1的空白串和長度為0的空串。
(3)串相等
當且僅當兩個串的值相等時,稱這兩個串是相等的,即只有當兩個串的長度相等,並且每個對應位置的字元都相等時才相等。
4.1.2 串的基本運算
(1)串賦值
strassign(s,t),表示將t串的值賦給s串。
(2)聯接
strcat(t1,t2),表示將t1串和t2串聯接起來,組成乙個新的t1串。
(3)求串長度
strlen (t),求t串的長度。
(4)子串
substr (s, i, len),表示擷取s串中從第i個字元開始連續len個字元,構成乙個新串(顯然該新串是s串的子串)。
(5)串比較大小
strcmp(s,t),比較s串和t串的大小,若s
4.2.1 順序儲存
4.2.1.1 定長順序串
定長順序串是將串設計成一種靜態結構型別,串的儲存分配是在編譯時完成的。與前面所講的線性表的順序儲存結構類似,可用一組位址連續的儲存單元存儲串的字串行。
定長順序串型別定義如下:
#define maxlen 40 typedef struct
sstring;
(1)串插入
/*在串 s 中下標為 pos 的字元之前插入串 t */
strinsert(sstring *s, int pos, sstring t) else
if (pos+t.len<=maxlen) else
return(1);
}
(2)串刪除
/*在串 s 中刪除從下標 pos 起 len 個字元*/
strdelete(sstring *s, int pos, int len)
4.2.1.2 堆串
字串包括串名與串值兩部分,而串值採用堆串儲存方法儲存,串名用符號表儲存。
這類串操作實現的演算法為:先為新生成的串分配乙個儲存空間,然後進行串值的複製。
c語言已經有乙個稱為堆
的自由儲存空間,並可用函式malloc()
和函式free()
完成動態儲存管理。因此,可以直接利用c語言中的「堆」來實現堆串。此時堆串可定義如下:
typedef
struct hstring ;
(1)求串長
int
strlen(hstring s)
(2)置空
status clearstring(hstring s)
s.length=0;
}
(3)生成堆
//生成乙個其值等於串常量chars的串t
status strassign(hstring t, char *chars) //空串
else
}
(4)比較函式
int
strcmp(hstring s, hstring t)
(5)拼接函式
// 用t返回由s1和s2聯接而成的新串
status strcat(hstring t, hstring s1,hstring s2)
(6)求子串
//用sub返回串s的第pos個字元起長度為len的子串
status substr(hstring sub, hstring s, int pos, int len) // 空子串
else
}
4.2.2 鏈式儲存
由於串也是一種線性表,因而也可以採用鏈式儲存。因為串是乙個特殊的線性表(表中每 個元素就是乙個字元)。
在具體實現時,乙個鍊錶存放乙個串值,每個結點既可以存放乙個字元, 如下所示:
typedef
struct nodelstring;
但這種方式儲存的密度太低,為了提高儲存的密度,使得每個節點能夠儲存多個字元,為便於操作,再增加乙個尾指標
,結構可定義如下:
#define block_size 4 //每結點存放字元個數
typedef
struct block block;
typedef
struct bltring;
4.3.1 bf演算法
(1)演算法思想:
將主串的第pos個字元和模式的第1個字元比較,若相等,繼續逐個比較後續字元;若不等,從主串的下一字元 (pos+1) 起,重新與第乙個字元比較。直到主串的乙個連續子串字串行與模式相等。返回值為s中與t匹配的子串行第乙個字元的序號,即匹配成功。否則,匹配失敗,返回值 0 。
(2)程式段:
int s_index(sstring t, sstring p, int pos)
return(0);
}
4.3.2 kmp演算法(略)4.4.1 例1
若n為主串長,m為子串長,則串的古典(樸素)匹配演算法最壞的情況下需要比較字元的總次數為__________。
(n - m + 1) * m4.4.2 例2
設有兩個串s和t,其中t是s的子串,求子串t在主串s中首次出現位置的演算法。
解:
int s_index(sstring s, sstring t)
return(0);
}
資料結構 第四章 串
1.串是由零到多個字元組成的字串行。2.串的模式匹配演算法 查詢子串 kmp演算法 關鍵是部分匹配值的計算 部分匹配 的實質是,有時候,字串頭部和尾部會有重複。1 熟練使用string.h中提供的串操作函式,理解串的表示和運算的實現。include include using namespace s...
資料結構 第四章
第四章 字串和多維陣列 4.1 字串 4.1.1 字串的定義 1.字串的定義 字串是零個或多個組成的有限序列,只包含空格的串成為空格串。串中所包含的字元個數成為串的長度,長度為0的串為空串,記作 乙個非空串通常該記作 s s1,s2 sn 字串中任意個連續的字元組成的子串行稱為該串的子串,相應地,包...
資料結構 第四章
第四章 字串和多維陣列 4.1 字串 4.1.1 字串的定義 1.字串的定義 字串是零個或多個組成的有限序列,只包含空格的串成為空格串。串中所包含的字元個數成為串的長度,長度為0的串為空串,記作 乙個非空串通常該記作 s s1,s2 sn 字串中任意個連續的字元組成的子串行稱為該串的子串,相應地,包...