串的基礎知識

2021-07-11 22:49:06 字數 4627 閱讀 9374

從資料結構角度看,棧和佇列是操作受限的線性表,他們的邏輯結構相同。 

串是重要的非數值處理物件,它是以字元作為資料元素的線性表。 

串:即字串,是由零個或多個字元組成的有限序列,是資料元素為單個字元的特殊線性表。 

若干術語: 

串長:串中字元個數(n≥0), n=0 時稱為空串 。

空白串:由乙個或多個空格符組成的串。 

字元位置:字元在串中的序號。 

串相等:串長度相等,且對應位置上字元相等。

子串:串中任意個連續的字元組成的子串行。 

主串:包含子串的串。 

子串的位置:子串的第乙個字元在主串中的序號。

串的資料物件約束為某個字符集。

微機上常用的字符集是標準ascii碼,由 7 位二進位制數    表示乙個字元,總共可以表示 128 個字元。擴充套件ascii      碼由 8 位二進位制數表示乙個字元,總共可以表示 256 個    字元,足夠表示英語和一些特殊符號,但無法滿足國際需要。  unicode碼由 16 位二進位制數表示乙個字元,總共可以表示2的16次方個字元,即6萬5千多個字元,能夠表示世界上所有語言的所有字元,包括亞洲國家的表意字元。為了保持相容性,unicode字符集中的前256個字元與擴充套件ascii碼完全相同。

adt string  

資料關係:

r1=基本操作:

初始條件:串 s 和 t 均存在,1≤pos≤strlength(s)+1。

操作結果:在串 s 的第 pos 個字元之前插入串t。 

例如:s = "chater",t = "rac", 則執行 strinsert (s, 4, t)                得到 s = "character" 

strdelete (&s, pos, len)    (刪除) 

初始條件:串 s 存在,且1≤pos≤strlength(s)-len+1。

操作結果:從串 s 中刪除第 pos 個字元起長度為len的子串。 

strassign (&t, chars)    (串賦值) 

初始條件:chars 是字串常量。 

操作結果:把 chars 賦為 t 的值。

strcopy (&t, s)    (串複製) 

初始條件:串 s 存在。 

操作結果:由串 s 複製得串 t。

concat (&t, s1, s2)    (串聯接) 

初始條件:串 s1 和 s2 存在。 

操作結果:t 為由串 s1 和串 s2 聯接所得的串。

例如: concat( t, "man", "kind")           求得  t = "mankind"         concat( t, "kind", "man")           求得  t = "kindman"

strcompare (s, t)    (串比較) 

初始條件:串 s 和 t 都存在。 

操作結果:若串 s > t, 則返回值》0;若s=t, 則返回值=0;若串 s 

例如:strcompare("data", "state")  0

replace ( s, t, v)    (串置換) 

初始條件:串 s, t 和 v 均已存在,且 t 是非空串。 

操作結果:用 v 替換主串 s 中出現的所有與(模式串)t 相等的不重疊的子串。

例如: 假設 s = "abcaabcaaabca",  t = "bca"

若 v = "x", 則經置換後得到     s = "axaxaax"

若 v = "bc", 則經置換後得到      s = "abcabcaabc"

substring (&sub, s, pos, len)    (求子串) 

初始條件:

串 s 存在,1≤pos≤strlength(s)    且  0≤len≤strlength(s)-pos+1。

操作結果: 以 sub 返回串 s 中第 pos 個字元起長度為 len 的子串。 

例如: substring ( sub, "commander", 4, 3)   

求得  sub = "man"

substring( sub, "commander", 1, 9)  

求得  sub = "commander"

substring( sub, "commander", 9, 1)  

求得  sub = "r"

index ( s, t, pos)    (定位函式) 

初始條件:串 s 和 t 存在,且 t 是非空串, 1≤pos≤strlength(s)。 

操作結果:若主串 s 中存在和串 t 值相同的子串,則返回它在主串 s 中第 pos個字元起第一次出現的位置;  否則函式值為0。 

假設 s = "abcaabcaaebc",  t = "abc"        

index(s, t, 1) = 1;    

index(s, t, 3) = 5;   

index(s, t, 8) = 0;

串和線性表的區別

串的邏輯結構和線性表極為相似,區別僅在於串的資料物件約束為字符集。

串的基本操作和線性表有很大差別。

而在串的基本操作中,通常以「串的整體」作為操作物件。

串的表示和實現

定長順序儲存特點:  

用一組連續的儲存單元來存放串,直接使用定長的字元陣列來定義,陣列的上界預先給出,故稱為靜態儲存分配。 

例如: 

#define maxstrlen 255    //使用者可用的最大串長    

typedef unsigned char sstring[ maxstrlen+1 ] ;       

sstring s;   //s是乙個可容納255個字元的順序串。

注:  一般用sstring[0]來存放串長資訊; 

c語言約定在串尾加結束符 『 \0』,以利操作加速,但不計入串長; 

若字串超過maxstrlen 則自動截斷(因為靜態陣列存不 進去)。

如果想要存放超長的字串,靜態陣列有缺陷,改用動態分配的一維陣列----------堆

堆分配儲存特點:

仍用一組連續的儲存單元來存放串,但儲存空間是在程式執行過程中動態分配而得。

思路:利用malloc函式合理預設串長空間。 

特點: 若在操作中串值改變,還可以利用realloc函式按新串長度增加(堆砌)空間。 

約定:所有按堆儲存的串,其關鍵資訊放置在:

typedef struct hstring 

用「堆」實現串插入操作

status strinsert ( hstring &s,  int pos,  hstring t )  

return ok;

}//strinsert

堆分配儲存表示

比較字串是否相同

int  strcompare ( hstring s, hstring t )         

s.length = 0;

return ok;

} // clearstring

聯接兩個串成新串

status concat ( hstring  &t, hstring  s1,  hstring  s2 )  // concat
求子串

status substring ( hstring &sub, hstring s, int pos, int len )    // 空子串         

塊鏈型別定義:

#define  chunksize  80     //可由使用者定義的塊大小 

typedef struct chunk chunk;

typedef struct lstring; //串型別只用一次,前面可以不加lstring

注:

串與線性表的運算有所不同,是以「串的整體」作為操作物件,例如查詢某子串,在主串某位置上插入乙個子串等。

這類操作中均涉及到定位問題,稱為串的模式匹配。它是串處理系統中最重要的操作之一。

關於串的模式匹配敬請期待。

申明:備考期末,如果不到之處,敬請指出,感激不盡。

電腦的基礎知識 電腦的基礎知識

電腦的組成部分與其作用 一 軟體系統 軟體系統的組成分別是 作業系統 應用軟體等。其應用軟體是指特定領域開發 並為特定目的服務的一類軟體。而作業系統是位於底層硬碟與使用者之間溝通的橋梁。使用者可以通過作業系統的使用者頁面,輸入命令,實現使用者需求。二 硬體系統 硬體系統是指構成計算機的物理裝置,即由...

電腦的基礎知識 電腦的基礎知識介紹

起尾我們需相識電腦的底子形成著名我們顧到的電腦皆是由 主機 次要部分 輸出裝置 矯飾器 輸出裝置 鍵盤戰滑鼠 三年夜件形成。而主機是電腦的主體,正在主機箱中有 主機板 cpu 記憶體 電源 音卡 音效卡 網絡卡 軟盤 軟碟機 光碟機等軟體。從底子機挨開往道,電腦不妨分為五年夜部分 運算器 記憶體器 ...

C 的基礎知識

一 請填寫bool float,指標變數與 零值 比較的if 語句。if n 0 if n 0 以次類推 請寫出bool flag與 零值 比較的 if 語句 if flag 請寫出 float x 與 零值 比較的 if 語句 const float espon 0.000001 if x esp...