天天看點

字元串和字元串的常見存儲結構

繼續接去年的常見資料結構和算法總結 系列随筆記錄

一、計算機裡進行非數值處理的對象基本上是字元串資料,比處理浮點和整數都要複雜

string串定義:由 0 個或多個 字元 組成的 有限的 序列,通常記為:s =“a1 a2 a3 … ai …an”  ( n≥0 ,且n是有限的)。其中的引号不屬于串,隻是一個标記作用!

n就是串的長度,且字元串裡的字元 ai 的值由 字母、數字或其他字元 組成的。

二、字元串為什麼要用雙引号标記

作用:避免字元串與變量名或數的常量混淆。  

三、幾個概念

空串:不含任何字元的串,長度 = 0,用符号 f  表示。也就是說空串也是字元串!

空格串:僅由一個或多個空格組成的串。 區分空串和空格串!

子串:由串中任意個連續的字元組成的子序列。空串是任意串的子串,任意串是其自身的子串。 

主串:包含子串的串。

字元的位置:字元在序列中的序号。

子串在主串中的位置:子串的首字元在主串中的位置。

字元串和字元串的常見存儲結構
字元串和字元串的常見存儲結構

串相等:當兩個串的長度相等且各個對應位置的字元都相等時才相等。

四、串的邏輯存儲結構

還是那句話,線性表是資料結構和算法的基礎!很多地方都以線性表為基礎去擴充!同樣,串的邏輯結構和線性表很相似!

串和線性表的差別:串的資料對象,我們約定是字元集,也就是說,字元串是資料受限的!而線性表的資料對象,不一定是字元集!可以存儲整數,浮點數等,都沒問題。

五、串的基本操作

和線性表差别較大。 因為,線性表的基本操作大多以“單個元素”作為操作對象,比如删除一個元素,初始化一個結點,插入一個結點等,而串的基本操作通常以“串這個整體”作為操作對象。比如在串中查找某個子串、在串的某個位置上插入一個子串、删除一個子串,子串的模式比對……

六、字元串的三種存儲結構

串也是一類特殊的線性表,故其存儲結構與線性表的存儲結構類似,隻不過組成串的結點是單個字元而已。

定長順序存儲

也稱為靜态存儲配置設定的順序串。即用一組位址連續的存儲單元依次存放串中的字元序列。“定長”、“靜态”的意思可簡單地了解為一個确定的存儲空間,它的長度是不變的。 

串長的表示方法:

1)在串的存貯區首位址顯式地記錄串的長度。 友善使用,一目了然,比如pascal語言。

2)在串之後加結束标志,隐式記錄串的長度,不直覺,如c/c++ 使用 “\0”。這裡使用的是1)中的顯式方式記錄串長度。

字元串和字元串的常見存儲結構

字元串this is a dog.  的存儲形式對比,要知道,串的靜态存儲結構(簡單一維數組表示),大小不可變。

注意:

1)串的實際長度可在這個預定義長度的範圍内随意設定,超過預定義長度的串值則被舍去,稱之為“截斷”。

2)字元類型存儲的是對應字元在 ascii 裡的值,10進制表示!

定長順序存儲表示時串操作的缺點 :

需事先預定義串的最大長度,這在實際的程式運作前是很難估計的。 

由于定義了串的最大長度,使得串的某些操作受限(截尾),如串的聯接、插入、置換等運算。

克服辦法:不限定最大長度——動态配置設定串值的存儲空間。 

ps:c沒有字元串類型,c的字元串類型實際上是字元數組。而常說的c風格字元串,實際是末尾元素為零的字元數組。其他字元串風格取決于該語言設計思想,如pascall語言為了強化類型管理與簡化實作,字元串類型不要求字元串尾部有特殊字元表示字元串結束,而采用一種資料結構來管理字元串,在字元串頭部分别有兩個字段表示了該字元串的長度和引用計數。這樣,簡單的指針指派直接複制位址并增加引用計數即可。而且字元串長度也不用每次都要重新計算。後來的c++、java等語言都借鑒了這樣的設計思想。

堆配置設定存儲(很重要,經常用)

堆存儲結構的特點:

仍以一組空間足夠大的、位址連續的存儲單元依次存放串值字元序列,但它們的存儲空間是在程式執行過程中動态配置設定的,c 語言中提供的串類型就是以這種存儲方式實作的。

由動态配置設定函數 malloc() 配置設定一塊實際串長所需要的存儲空間(“堆”),如果配置設定成功,則傳回此空間的起始位址,作為串的基址,由 free( ) 釋放串不再需要的空間。 

這樣配置設定的字元串,對配置設定的,可以動态改變長度,進行串的複制,插入,連接配接,置換算法等

堆存儲結構的優點:

堆存儲結構既有順序存儲結構的特點,處理(随機取子串)友善,操作中對串長又沒有任何限制,更顯靈活,是以在串處理的應用程式中常被采用。 

塊鍊存儲

剛剛的堆配置設定,其實還是順序表的動态配置設定的演化。那麼自然有連結清單的演化,串值也可用單連結清單存儲,簡稱為鍊串。 鍊串與單連結清單的差異隻是它的結點資料域為單個字元。 

字元串和字元串的常見存儲結構

優點:便于插入和删除    缺點:空間使用率低 ,這裡知道一個公式:

字元串和字元串的常見存儲結構

為了提高空間使用率,可使每個結點存放多個字元(這是順序串和鍊串的綜合 (折衷) ),稱為塊鍊結構。 實際應用時,可以根據問題所需來設定結點的大小。例如:在編輯系統中,整個文本編輯區可以看成是一個串,每一行是一個子串,構成一個結點。即:同一行的串用定長結構(80個字元),行和行之間用指針相聯接。 

為了便于進行串的操作(連接配接等),當以塊鍊存儲串值時,除頭指針外還可附設一個尾指針訓示連結清單中的最後一個結點,并給出目前串的長度。

字元串和字元串的常見存儲結構

先表示塊鍊的結點的結構(這也是這類問題的慣常做法,鍊式的,可以考慮定義單個的結點,然後定義整體的組織,從小到大,由内而外!)

串的連結清單結構

辛苦的勞動,轉載請注明出處,謝謝……

http://www.cnblogs.com/kubixuesheng/p/4116378.html