




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、4. 4. 串串2 4.1 4.1 串類型的定義串類型的定義3串的抽象數(shù)據類型的定義如下:串的抽象數(shù)據類型的定義如下:ADT String 數(shù)據對象數(shù)據對象:D ai |aiCharacterSet, i=1,2,.,n, n0 數(shù)據關系數(shù)據關系:R1 | ai-1, ai D, i=2,.,n 串是有限長的字符序列,串是有限長的字符序列,由一對單引號相括,如由一對單引號相括,如: a string 4StrAssign (&T, chars) 初始條件:chars 是字符串常量。 操作結果:把 chars 賦為 T 的值?;静僮骰静僮鱏trCopy (&T, S) 初始條
2、件:串 S 存在。 操作結果:由串 S 復制得串 T。5 DestroyString (&S) 初始條件:串 S 存在。 操作結果:串 S 被銷毀。基本操作基本操作StrEmpty (S)初始條件:串S存在。操作結果:若 S 為空串,則返回TRUE, 否則返回 FALSE。 表示空串,空串的長度為零。 ClearString (&S) 初始條件:串S存在。 操作結果:將S清為空串。6StrCompare (S, T)初始條件:串S 和 T 存在。操作結果:若S T,則返回值 0; 若S T,則返回值 0; 若S T,則返回值 0。例如:例如:StrCompare(data, s
3、tate) 0基本操作基本操作StrLength (S) 初始條件:串 S 存在。 操作結果:返回 S 的元素個數(shù), 稱為串的長度。7Concat (&T, S1, S2)初始條件:串 S1 和 S2 存在。 操作結果:用 T 返回由 S1 和 S2 聯(lián)接而成的新串。例如: Concate( T, man, kind) 求得 T = mankind基本操作基本操作 SubString (&Sub, S, pos, len)初始條件: 串 S 存在,1posStrLength(S) 且0lenStrLength(S)-pos+1。操作結果: 用 Sub 返回串 S 的第 pos
4、個字符起 長度為 len 的子串。8例如: SubString( sub, commander, 4, 3) 求得 sub = man ; SubString( sub, commander, 1, 9)求得 sub = commander;子串為子串為“串串” 中的一個字符子序列中的一個字符子序列基本操作基本操作SubString(sub, commander, 4, 7) sub = ? SubString(student, 5, 0) = 起始位置和子串長度之間存在約束關系長度為 0 的子串為“合法”串9Index (S, T, pos)初始條件:串S和T存在,T是非空串, 1posSt
5、rLength(S)。操作結果: 若主串 S 中存在和串 T 值相同的子串, 則返回它在主串 S 中第pos個字符之后第一次出現(xiàn)的位置; 否則函數(shù)值為0。 基本操作基本操作 “子串在主串中的位置子串在主串中的位置”意指子串意指子串中的第一個字符在主串中的位序。中的第一個字符在主串中的位序。假設 S = abcaabcaaabc, T = bca Index(S, T, 1) = 2;Index(S, T, 3) = 6;Index(S, T, 8) = 0;10 Replace (&S, T, V) 初始條件:串S, T和 V 均已存在,且 T 是非空串。 操作結果:用V替換主串S中出
6、現(xiàn) 的所有與(模式串)T相等的不重疊的子串?;静僮骰静僮骼纾杭僭O S = abcaabcaaabca,T = bca若 V = x, 則經置換后得到 S = axaxaax若 V = bc, 則經置換后得到 S = abcabcaabc11 StrInsert (&S, pos, T)初始條件:串S和T存在,1posStrLength(S)1。操作結果:在串S的第pos個字符之前插入串T。例如:S = chater,T = rac, 則執(zhí)行 StrInsert(S, 4, T)之后得到 S = character基本操作基本操作 StrDelete (&S, pos, l
7、en)初始條件:串S存在 1posStrLength(S)-len+1。操作結果:從串S中刪除第pos個字符 起長度為len的子串。 12對于串的基本操作集可以有不同的定義方法,在使用高級程序設計語言中的串類型時,應以該語言的參考手冊為準以該語言的參考手冊為準。 gets(str) 輸入一個串; puts(str) 輸出一個串; strcat(str1, str2) 串聯(lián)接函數(shù); strcpy(str1, str2, k) 串復制函數(shù); strcmp(str1, str2) 串比較函數(shù); strlen(str) 求串長函數(shù);例如:C語言函數(shù)庫中提供下列串處理函數(shù):13在上述抽象數(shù)據類型定義的1
8、3種操作中, 串賦值串賦值StrAssign、串復制、串復制Strcopy、 串比較串比較StrCompare、求串長、求串長StrLength、 串聯(lián)接串聯(lián)接Concat以及求子串以及求子串SubString 等六種操作構成串類型的最小操作子集等六種操作構成串類型的最小操作子集。 即:這些操作不可能利用其他串操作來實現(xiàn), 反之,其他串操作(除串清除ClearString和串 銷毀DestroyString外)可在這個最小操作子 集上實現(xiàn)。14 例如,可利用串比較、求串長和求子串等操作實現(xiàn)定位函數(shù)Index(S,T,pos)。 StrCompare(SubString(S, i, StrLen
9、gth(T),T ) ? 0 S 串 T 串 T 串iposn-m+1算法的基本思想為:算法的基本思想為:15int Index (String S, String T, int pos) / T為非空串。若主串S中第pos個字符之后存在與 T相等的子串,則返回第一個這樣的子串在S中的位置,否則返回0 if (pos 0) n = StrLength(S); m = StrLength(T); i = pos; while ( i = n-m+1) SubString (sub, S, i, m); if (StrCompare(sub,T) != 0) +i ; else return i
10、; / while / if return 0; / S中不存在與T相等的子串 / Index算法描述算法描述16串的置換函數(shù)串的置換函數(shù): S 串 T 串 V 串 V 串pospos subinews 串sub17 串的邏輯結構和線性表極為相似,區(qū)別區(qū)別僅在于串的數(shù)據對象約束為字符集。 串的基本操作和線性表有很大差別。串的基本操作和線性表有很大差別。 在線性表的基本操作中,大多以大多以“單個元素單個元素”作為作為操作對象操作對象; 在串的基本操作中,通常以通常以“串的整體串的整體”作為操作作為操作對象對象。184.2 串的表示和實現(xiàn)串的表示和實現(xiàn)19 #define MAXSTRLEN 25
11、5 / 用戶可在255以內定義最大串長 typedef unsigned char SstringMAXSTRLEN + 1; / 0號單元存放串的長度串的定長順序存儲表示串的定長順序存儲表示 按這種串的表示方法實現(xiàn)的串的運算時,其基本操作為 “字符序列的復制字符序列的復制”。 串串的實際長度可在這個予定義長度的范圍內隨意設定,超過予定義長度的串值則被舍去,稱之為“截斷截斷” 。20 Status Concat(SString S1, SString S2, SString &T) / 用T返回由S1和S2聯(lián)接而成的新串。若未截斷, 則返回TRUE,否則FALSE。 return un
12、cut; / Concat串的聯(lián)接算法中需分三種情況處理:串的聯(lián)接算法中需分三種情況處理: T1.S10 = S11.S10; TS10+1.S10+S20 = S21.S20; T0 = S10+S20; uncut = TRUE; if (S10+S20 = MAXSTRLEN) / 未截斷 else if (S10 MAXSTRSIZE) / 截斷 else / 截斷(僅取S1)T1.S10 = S11.S10;TS10+1.MAXSTRLEN = S21.MAXSTRLENS10;T0 = MAXSTRLEN; uncut = FALSE; T0.MAXSTRLEN = S10.MAX
13、STRLEN; / T0 = S10 = MAXSTRLEN uncut = FALSE; 21 typedef struct char *ch; / 若是非空串,則按串長分配存儲區(qū), / 否則ch為NULL int length; / 串長度 HString;串的堆分配存儲表示串的堆分配存儲表示 這類串操作實現(xiàn)的算法為: 先為新生成的串分配一個存儲空間,然后 進行串值的復制。22Status Concat(HString &T, HString S1, HString S2) / 用T返回由S1和S2聯(lián)接而成的新串 if (T.ch) free(T.ch); / 釋放舊空間 if (
14、!(T.ch = (char *) malloc(S1.length+S2.length)*sizeof(char) exit (OVERFLOW); T.ch0.S1.length-1 = S1.ch0.S1.length-1; T.length = S1.length + S2.length; T.chS1.length.T.length-1 = S2.ch0.S2.length-1; return OK; / Concat串的聯(lián)接串的聯(lián)接23 Status SubString(HString &Sub, HString S,int pos, int len) / 用Sub返回串S
15、的第pos個字符起長度為len的子串 if (pos S.length | len S.length-pos+1) return ERROR; if (Sub.ch) free (Sub.ch); / 釋放舊空間 if (!len) Sub.ch = NULL; Sub.length = 0; / 空子串 else Sub.ch = (char *)malloc(len*sizeof(char); Sub.ch0.len-1 = Spos-1.pos+len-2; Sub.length = len; / 完整子串 return OK; / SubString24串的塊鏈存儲表示串的塊鏈存儲表示
16、也可用鏈表來存儲串值,由于串的數(shù)據元素是一個字符,它只有 8 位二進制數(shù),因此用鏈表存儲時,通常一個結點中存放的不是一個字符,而是一個子串。存儲密度存儲密度 = 數(shù)據元素所占存儲位實際分配的存儲位25 #define CHUNKSIZE 80 / 可由用戶定義的塊大小 typedef struct Chunk / 結點結構 char chCUNKSIZE; struct Chunk *next; Chunk; typedef struct / 串的鏈表結構 Chunk *head, *tail; / 串的頭和尾指針 int curlen; / 串的當前長度 LString;264.34.3串的
17、模式匹配算法串的模式匹配算法27初始條件:串S和T存在,T是非空串, 1posStrLength(S)。操作結果:若主串S中存在和串T值相 同的子串返回它在主串S中 第pos個字符之后第一次出 現(xiàn)的位置;否則函數(shù) 值為0。 首先,回憶一下串匹配(查找)的定義:INDEX (S, T, pos)28 下面討論以定長順序結構表示串時的幾種算法。一、簡單算法一、簡單算法二、首尾匹配算法二、首尾匹配算法三、三、KMP(KMP(D.E.Knuth, V.R.Pratt, J.H.Morris) 算法算法29int Index(SString S, SString T, int pos) / 返回子串返回
18、子串T在主串在主串S中第中第pos個字符之后的位置。若不存在,個字符之后的位置。若不存在, / 則函數(shù)值為則函數(shù)值為0。其中,。其中,T非空,非空,1posStrLength(S)。 i = pos; j = 1; while (i = S0 & j T0) return i-T0; else return 0; / Index簡單算法簡單算法30 先比較模式串的第一個字符, 再比較模式串的最后一個字符, 最后比較模式串中從第二個到 第n-1個字符。首尾匹配算法首尾匹配算法31 int Index_FL(SString S, SString T, int pos) sLength =
19、S0; tLength = T0; i = pos; patStartChar = T1; patEndChar = TtLength; while (i = sLength tLength + 1) if (Si != patStartChar) +i; /重新查找匹配起始點 else if (Si+tLength-1 != patEndChar) +i; / 模式串的“尾字符”不匹配 else return 0; / 檢查中間字符的匹配情況檢查中間字符的匹配情況32 k = 1; j = 2; while ( j tLength & Si+k = Tj) +k; +j; if (
20、j = tLength ) return i; else +i; / 重新開始下一次的匹配檢測33KMP算法的時間復雜度可以達到O(m+n) 當 Si Tj 時, 已經得到的結果: Si-j+1.i-1 = T1.j-1 若已知 T1.k-1 = Tj-k+1.j-1 則有 Si-k+1.i-1 = T1.k-1KMP(KMP(D.E.Knuth, V.R.Pratt, J.H.Morris) 算法算法34定義:定義:模式串的nextnext函數(shù)其它情況且時當 1 pppppjk1|Maxk1j 0j1- j1k- j1-k21next35 int Index_KMP(SString S, S
21、String T, int pos) / 1posStrLength(S) i = pos; j = 1; while (i = S0 & j T0) return i-T0; / 匹配成功 else return 0; / Index_KMP36這實際上也是一個匹配的過程,不同在于:主串和模式串是同一個串求next函數(shù)值的過程是一個遞推過程,分析如下:已知:next1 = 0;假設:nextj = k;又 Tj = Tk則: nextj+1 = k+1若: Tj Tk則需往前回朔,檢查 Tj = T ?37 void get_next(SString &T, int &
22、;next ) / 求模式串T的next函數(shù)值并存入數(shù)組next i = 1; next1 = 0; j = 0; while (i T0) if (j = 0 | Ti = Tj) +i; +j; nexti = j; else j = nextj; / get_next38還有一種特殊情況需要考慮:例如: S = aaabaaabaaabaaabaaab T = aaaabnextvalj=00004nextj=0123439 void get_nextval(SString &T, int &nextval) i = 1; nextval1 = 0; j = 0; whi
23、le (i T0) if (j = 0 | Ti = Tj) +i; +j; if (Ti != Tj) nextvali = j; else nextvali = nextvalj; else j = nextvalj; / get_nextval40習題F用無回溯的模式匹配法(KMP法)及快速的無回溯的模式匹配法求模式串T的nextj值,添入下面表中:j1 2 3 4 5 6 7ta a b b a a bkmp法求得的nextj值0 1 2 1 1 2 3 快速無回溯法求得的nextj值0 0 2 1 0 0 2 j1 2 3 4 5 6 7ta a b b a a bkmp法求得的nextj值 快速無回溯法求得的nextj值 41習題F輸入一個字符串,內有數(shù)字和非數(shù)字字符,如:ak123x456 17960?302gef4563,將其中連續(xù)的數(shù)字作為一個整體,依次存放到一數(shù)組中,例如123放入,456放入,。編程統(tǒng)計其共有多少個整數(shù),并輸出這些數(shù)。F以順序存儲結構表示串,設計算法。求串S中出現(xiàn)的第一個最長重復子串及其位置并分析算
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 掀起復習熱潮2024年陪診師考試試題及答案
- 14普羅米修斯(教學設計)-2024-2025學年語文四年級上冊統(tǒng)編版
- 通過故事分享提升道德認知計劃
- 如何有效地進行預算控制計劃
- 總結中發(fā)現(xiàn)機會與挑戰(zhàn)的管理思路計劃
- 促進社區(qū)經濟循環(huán)的策略計劃
- 全面了解寵物殯葬師考試試題及答案
- 深度解讀監(jiān)理工程師考試試題及答案
- 優(yōu)化教師資格證復習試題及答案
- 夏季防蛇安全
- 《清華大學介紹》課件
- 重癥??谱o士考試題庫(含答案)
- 神經阻滯療法在慢性疼痛治療中的應用-課件
- 遼寧省大連市藥品零售藥店企業(yè)藥房名單目錄
- 《作文吹泡泡》-完整版課件
- 電化學儲能保險發(fā)展報告
- 不合格產品統(tǒng)計表
- 《外科學》第七節(jié) 直腸癌
- DG-TJ 08-2002-2020 懸挑式腳手架安全技術標準 高質量清晰版
- Z世代消費態(tài)度洞察報告
- 辦公樓辦公室改檔案室結構加固施工方案(15頁)
評論
0/150
提交評論