上一章我們說了棧與佇列這種基礎的資料結構,這一章我們簡單的來說說另一種資料結構:串,首先我們來了解下串是什麼?
串( string )是由零個或多個字元組成的有限序列,又名叫字串。
一般記為s= 「a1a2…… .an」 (n>=0), 其中,s 是串的名稱,用雙引號(有些地方也用單引號)括起來的字串行是串的值,注意單引號不屬於串的內容。 ai(1 =< i <= n) 可以是字母、 數字或其他字元, i 就是該字元在串中的位置。串中的字元數目 n 稱為串的長度, 定義中談到"有限"是指長度 n 是乙個有限的數值。零個字元的串稱為空串 (null string), 串的長度為零,可以直接用兩雙引號 " 「」 " 表示。所謂的序列,說明串的相鄰字元之間具有前驅和後繼的關係。
還有一些概念需要解釋。
空格串,是只包含空格的串。注意它與空串的區別,空格串是有內容有長度的,而且可以不止乙個空格。
子串與主串, 串中任意個數的連續字元組成的子串行稱為該串的子串,相應地,包含子串的串稱為主串。子串在主串中的位置就是子串的第乙個字元在主串中的序號。
舉個例子: 「over」 、 「end」、「lie」 其實可以認為是 「lover」 、 「friend」 、 「believe」 這些單詞字串的子串。
串的邏輯結構和線性表很相似,不同之處在於串針對的是字符集,也就是串中的元素都是字元,哪怕串中的字元是 「123」 這樣的數字組成,或者 「2010-10-10」 這樣的日期組成,它們都只能理解為長度為 3 和長度為 10 的字串,每個元素都是字元而已。
因此,對於串的基本操作與線性表是有很大差別的,線性表更關注的是單個元素的操作,比如查詢乙個元素,插入或刪除乙個元素,但串中更多的是查詢子串位置、 得到指定位置子串、替換子串等操作。
串的儲存結構與線性表相同,分為兩種:順序儲存與鏈式儲存。
順序儲存結構
串的順序儲存結構是用一組位址連續的儲存單元來儲存串中的字串行的。按照預定義的大小,為每個定義的感變數分配乙個固定長度的儲存區。一般是用定長陣列來定義。
既然是定長陣列,就存在乙個預定義的最大串長度, 一般可以將實際的串長度值儲存在陣列的 0 下標位置,有的書中也會定義儲存在陣列的最後乙個下標位置。但也有些程式語言不想這麼幹,覺得存個數字占個空間麻煩。它規定在串值後面加乙個不計入串長度的結束標記字元,比如」\0",來表示串值的終結,這個時候,你要想知道此時的串長度,就需要遍歷計算一下才知道了,其實這還是需要占用乙個空間,何必呢。如圖所示:
鏈式儲存結構
對於串的鏈式儲存結構,與線性表是相似的,但由於串結構的特殊性,結構中的每個元素資料是乙個字元,如果也簡單的應用鍊錶儲存串值, 乙個結點對應乙個字元,就會存在很大的空間浪費。 因此,乙個結點可以存放乙個字元,也可以考慮存放多個字元,最後乙個結點若是未被佔滿時,可以用」#「 或其他非串值字元補全,如下圖所示:
當然,這裡乙個結點存多少個字元才合適就變得很重要,這會直接影響著串處理的效率,需要根據實際情況做出選擇。
但串的鏈式儲存結構除了在連線串與串操作時有一定方便之外,總的來說不如順序儲存靈活,效能也不如順序儲存結構好。
其實串最主要的作用是用來做字串連線、插入、複製與匹配等,其中的連線,插入,複製都是很簡單的,但是匹配就比較複雜了,其中涉及到了匹配演算法的問題,但是很抱歉,我看了關於字串的樸素匹配演算法與kmp模式匹配演算法,感覺自己勉強能理解,本來嘗試著寫了一些,但是和別人相比真的感覺差距太大,怕這裡寫出來誤認子弟,這裡推薦乙個我覺得說得很好的博主說的kmp匹配演算法,同時這個博主的其餘演算法知識也是相當值得學習的。
《從頭到尾徹底理解kmp》
資料結構與演算法(十一) 串
iwehdio的 如何評測串匹配演算法的效能?蠻力匹配 版本2 int match char p,char t if j m break 找到匹配子串 return i 唯一的區別就是版本1中i指向文字t中進行比較的位置,版本2中i指向模式t開始比較的位置。最壞情況下可達到o m n 低效的原因在於...
資料結構 十一
排序 include void myswap int a,int i,int j 交換函式 void mysort int a,int len 普通的氣泡排序 mysort1 a,len 1 void myprint int a,int len 列印函式 printf n void mysort2 ...
十一章 資料結構
鍊錶 我們常用的儲存資料的方式無非就是陣列。使用陣列儲存資料的好處就是查詢快,但是它的弊端也很明顯 使用前需宣告陣列的長度,一旦宣告長度就不能更改 插入和刪除操作需要移動大量的陣列元素,效率慢 只能儲存一種型別的資料.n個節點離散分配 每乙個節點之間通過指標相連 每乙個節點有乙個前驅節點和乙個後繼節...