




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第5章串和數(shù)組串也可以看作是一種線性表,只是其操作通常是按成組的元素來進(jìn)行的。數(shù)組可以認(rèn)為是線性表在維數(shù)上的一種拓展。串和數(shù)組依然屬于線性結(jié)構(gòu),但在存儲結(jié)構(gòu)的實現(xiàn)方面較線性表為復(fù)雜。值得注意的是,串和數(shù)組是在高級語言層面已經(jīng)實現(xiàn)的數(shù)據(jù)類型,在數(shù)據(jù)結(jié)構(gòu)中再討論它們是為了深入理解實現(xiàn)它們的基礎(chǔ)技術(shù)。講授本章課程大約需4課時。1第5章串和數(shù)組串也可以看作是一種線性表,只是其操作通
5.1串的定義和操作5.2串的表示和實現(xiàn)
5.3正文模式匹配5.4正文編輯━串操作應(yīng)用舉例25.1串的定義和操作25.1串的定義和操作35.1串的定義和操作3串的定義:
串(String),或稱字符串是由零個或多個字符組成的有限序列。記作:S=a0a1…ai…an-1
(n≥0)
其中,ai屬于字符集,n為串的長度,當(dāng)n=0時串為空串。例如:
astring、a+b、
4串的定義:串(String),或稱字符串是由零個或串的基本操作:
StrAssign(&T,chars)
StrCopy(&T,S)
DestroyString(&S)
StrEmpty(S)
StrCompare(S,T)
StrLength(S)
Concat(&T,S1,S2)5串的基本操作:StrAssign(&T,chars)SubString(&Sub,S,pos,len)
Index(S,T,pos)
Replace(&S,T,V)StrInsert(&S,pos,T)StrDelete(&S,pos,len)
ClearString(&S)6SubString(&Sub,S,pos,len)
StrAssign(&T,chars)
初始條件:chars是字符串常量。
操作結(jié)果:把chars賦為T的值。
7StrAssign(&T,chars)7
StrCopy(&T,S)
初始條件:串S存在。
操作結(jié)果:由串S復(fù)制得串T。8
StrCopy(&T,SDestroyString(&S)
初始條件:串S存在。
操作結(jié)果:串S被銷毀。9DestroyString(&S)9
表示空串,空串的長度為零
StrEmpty(S)
初始條件:串S存在。
操作結(jié)果:若S為空串,則返回TRUE,否則返回FALSE。
表示空格,長度為1的字符串10表示空串,空串的長度
StrCompare(S,T)
初始條件:串S和T存在。
操作結(jié)果:若ST,則返回值0;
若ST,則返回值0;
若ST,則返回值0。例如:StrCompare(data,state)<0StrCompare(cat,case)>011StrCompare(
StrLength(S)
初始條件:串S存在。
操作結(jié)果:返回S的元素個數(shù),
稱為串的長度。12StrLength(S)
Concat(&T,S1,S2)
初始條件:串S1和S2存在。
操作結(jié)果:用T返回由S1和S2
聯(lián)接而成的新串。例如:Concate(T,man,kind)
求得T=mankind13Concat(&T,S1,S2)
初
SubString(&Sub,S,pos,len)初始條件:
串S存在,0≤pos<StrLength(S)且0≤len≤StrLength(S)-pos。操作結(jié)果:
用Sub返回串S的位置為pos起長度為len的子串。14
SubString(&Sub,S,pos,例如:
SubString(sub,commander,3,3)
求得sub=man;SubString(sub,commander,0,9)求得sub=commander;SubString(sub,commander,8,1)求得sub=r;子串為“串”中的一個字符子序列15例如:子串為“串”中的一個字符子序列15SubString(sub,commander,4,7)sub=?SubString(sub,beijing,7,2)=?sub=?SubString(student,5,0)=起始位置和子串長度之間存在約束關(guān)系長度為0的子串為“合法”串16SubString(sub,commander,
Index(S,T,pos)
初始條件:串S和T存在,T是非空串,
0≤pos≤StrLength(S)-1。
操作結(jié)果:
若主串S中存在和串T值相同
的子串,則返回它在主串S中第pos個
字符之后第一次出現(xiàn)的位置;
否則函數(shù)值為-1。
17Index(S,T,假設(shè)S=abcaabcaaabca,T=bca
Index(S,T,1)=1;Index(S,T,3)=5;Index(S,T,11)=-1;
“子串在主串中的位置”意指子串中的第一個字符在主串中的位序。18假設(shè)S=abcaabcaaabca,T=
Replace(&S,T,V)
初始條件:串S,T和V均已存在,
且T是非空串。
操作結(jié)果:
用V替換主串S中出現(xiàn)
的所有與(模式串)T
相等的不重疊的子串。19
Replace(&S,T,V例如:假設(shè)S=abcaabcaaabca,T=bca若V=
x,則經(jīng)置換后得到S=axaxaax若V=bc,則經(jīng)置換后得到S=abcabcaabc20例如:假設(shè)S=abcaabcaaabca,T
StrInsert(&S,pos,T)
初始條件:串S和T存在,1≤pos≤StrLength(S)。
操作結(jié)果:在串S的第pos個字符之前插入串T。例如:S=chater,T=rac,則執(zhí)行StrInsert(S,4,T)之后得到S=character21StrInsert(&S,pos,T)
StrDelete(&S,pos,len)
初始條件:串S存在
1≤pos≤StrLength(S)-len。
操作結(jié)果:從串S中刪除位置pos
起長度為len的子串。
22StrDelete(&S,pos,lenClearString(&S)
初始條件:串S存在。
操作結(jié)果:將S清為空串。
23ClearString(&S)
初始條件:
對于串的基本操作集可以有不同的定義方法,在使用高級程序設(shè)計語言中的串類型時,應(yīng)以該語言的參考手冊為準(zhǔn)。
gets(str)輸入一個串;
puts(str)
輸出一個串;
strcat(str1,str2)串聯(lián)接函數(shù);
strcpy(str1,str2)
串復(fù)制函數(shù);
strcmp(str1,str2)串比較函數(shù);
strlen(str)求串長函數(shù);
char*strstr(char*s,char*sub)
如果找到子串,返回該位置的指針。如果找不到,則返回空指針。-C語言程序設(shè)計-附錄C例如:C語言函數(shù)庫中提供下列串處理函數(shù):24對于串的基本操作集可以有不同的定義方法,在使用高級在上述串類型定義的13種操作中,串賦值StrAssign、串復(fù)制Strcopy、串比較StrCompare、求串長StrLength、串聯(lián)接Concat以及求子串SubString等六種操作構(gòu)成串類型的最小操作子集。
即:這些操作不可能利用其他串操作來實現(xiàn),反之,其他串操作(除串清除ClearString和串銷毀DestroyString外)可在這個最小操作子集上實現(xiàn)。25在上述串類型定義的13種操作中,25例如,可利用串比較、求串長和求子串等操作實現(xiàn)定位函數(shù)Index(S,T,pos)。pos<=i<=n-mSubString(sub,S,i,StrLength(T))StrCompare(sub,T)
?
0
S串T串
T串iposn-m算法的基本思想為:26例如,可利用串比較、求串長和求子串等操作實現(xiàn)定位函數(shù)int
Index(StringS,StringT,intpos){
//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
returni;//S中的第一個與T相等子串的位置
}
//while
}
//if
return
-1;//S中不存在與T相等的子串}//Index27intIndex(StringS,StringT串的邏輯結(jié)構(gòu)和線性表極為相似,區(qū)別僅在于串的數(shù)據(jù)對象約束為字符集。
串的基本操作和線性表有很大差別。
在線性表的基本操作中,大多以“單個元素”作為操作對象;在串的基本操作中,通常以“串的整體”作為操作對象。28串的邏輯結(jié)構(gòu)和線性表極為相似,區(qū)別串的基本操5.2串的表示和實現(xiàn)295.2串的表示和實現(xiàn)29在程序設(shè)計語言中,串只是作為輸入或輸出的常量出現(xiàn),則只需存儲此串的串值,即字符序列即可。但在多數(shù)非數(shù)值處理的程序中,串也以變量的形式出現(xiàn)。30在程序設(shè)計語言中,串只是作為輸入或輸出的常量出現(xiàn),則一、串的定長順序存儲表示二、串的堆分配存儲表示三、串的塊鏈存儲表示(在存儲結(jié)構(gòu)的層面討論串的操作)31一、串的定長順序存儲表示二、串的堆分配存儲表示三、串的塊鏈存一、串的定長順序存儲表示
如果利用C語言的串類型描述算法,可用一組連續(xù)的存儲單元存放串的字符序列,并以‘\0’為結(jié)束標(biāo)志。使用C語言的字符數(shù)組來存儲字符串。如,chars[]="abc";//字符串的長度為3chara[10];//字符串最大串長為9
32一、串的定長順序存儲表示如果利用C語言的串類型描述算法
按這種串的表示方法實現(xiàn)的串的運算時,其基本操作為“字符序列的復(fù)制”串的實際長度可在這個預(yù)定義長度的范圍內(nèi)隨意設(shè)定,超過預(yù)定義長度的串值則被舍去,稱之為“截斷”串的定長順序存儲操作特點:33按這種串的表示方法實現(xiàn)的串的運算時,其基本操作為“字符序void
concat_sq(char
s1[],char
s2[],char
t[
])
{
int
j=0,k=0;
while(s1[j]!='\0')
t[k++]=s1[j++];//復(fù)制S1
j=0;
while(s2[j]!=‘\0’)t[k++]=s2[j++];
//接著復(fù)制S2
t[k]='\0';//增加結(jié)束符}例如:串的聯(lián)接操作concat34voidconcat_sq(chars1[],charvoidmain(){
char
s1[]="china";
char
s2[]="beijing";
char
t1[13];
//順序分配定長空間
concat(s1,s2,t1); cout<<t1<<endl;}定長分配體現(xiàn)在調(diào)用程序35voidmain(){定長分配體現(xiàn)在調(diào)用程序35typedefstruct{char*ch;
//若是非空串,則按串長分配存儲區(qū),//否則ch為NULL
int
length;//串長度
}
HString;二、串的堆分配存儲表示如果完全用偽碼描述算法,可進(jìn)行類型定義:36typedefstruct{二、串的堆分配存儲表示如果直接用C語言描述算法,可通過函數(shù)new和delete為用戶進(jìn)行串值空間的動態(tài)管理,為每一個新產(chǎn)生的串分配一個存儲區(qū),稱串值共享的存儲空間為“堆”。
本書采用這種方式。
這類串操作實現(xiàn)的常用思路:先為新生成的串分配一個存儲空間,然后進(jìn)行串值的復(fù)制。37如果直接用C語言描述算法,可通過函數(shù)new和deleconcat
操作substring
操作串的堆分配存儲表示實現(xiàn)38concat操作substring操作串的堆分配存儲表示void
concat(char*s1,char*s2,char*&t){
inti=0,j=0;
t=new
char[strlen(s1)+strlen(s2)+1];//為t分配堆空間
while((t[i]=s1[i])!='\0')i++;
while((t[i]=s2[j])!='\0'){i++;j++;
}
}39voidconcat(char*s1,char*s2voidmain()
{
char*s1="china";
char*s2="beijing";
char*t1;//僅說明類型而不申請空間concat(s1,s2,t1);
cout<<t1<<endl;}調(diào)用程序無需預(yù)先申請空間40voidmain(){調(diào)用程序無需預(yù)先申請空間40
void
substring(char*&sub,char*s,intpos,intlen){char*p;
intk,slen=strlength(s);
if(pos<0||pos>slen-1||len<0||len>slen-pos)
ERRORMESSAGE(“參數(shù)不合法”);sub=new
char[len+1];//為sub分配堆空間p=s+pos-1;k=len;
while(k){*sub++=*p++;k--;
}*sub='\0';sub=sub-len;}41voidsubstring(char*&sub,c5.3正文模式匹配425.3正文模式匹配42先前,曾介紹過串匹配(查找)的操作INDEX(S,T,pos)在實際應(yīng)用中,串的匹配查找操作使用的機(jī)會很多,現(xiàn)專門討論該算法。使用串的有關(guān)操作實現(xiàn)了INDEX,但在效率上仍有改進(jìn)的余地。43先前,曾介紹過串匹配(查找)的操作INDEX(S,T
簡單算法(簡單的正文模式匹配算法)
以定長順序結(jié)構(gòu)表示串a(chǎn)baacababaacbcaababaacbaabaacabaacST演示模型:匹配成功!44簡單算法(簡單的正文模式匹配算法)abaacababaacint
Index_BF(charS[],charT[],intpos){
//返回子串T在主串S中第pos個字符之后的位置。若不存在,//則函數(shù)值為-1。其中,T非空,0≤pos≤StrLength(S)-1。i=pos;j=0;
while(S[i+j]!=‘\0’&&T[j]!=‘\0’)
if(S[i+j]==T[j])j++;//繼續(xù)比較后繼字符
else
{i++;j=0;}
//重新開始新一輪的匹配
if(T[j]!=‘\0’)returni;
elsereturn-1;}//Index_BF45intIndex_BF(charS[],charT[若找到S中所有和模式串T匹配的子串,只需多次調(diào)用Index_BF(charS[],charT[],intpos)匹配成功后,下一次的匹配起始位置為i+Strlength(T)Index_BF不是最精巧的模式匹配算法,但比較好理解,適合于一般的使用。46若找到S中所有和模式串T匹配的子串,只需多次調(diào)用Inde5.4正文編輯
━串操作應(yīng)用舉例47
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年初中數(shù)學(xué)綜合素質(zhì)評價模擬考試試卷及答案
- 兒科護(hù)理個人述職
- 遠(yuǎn)離煙與毒 做健康少年
- 廣西欽州欽州港區(qū)六校聯(lián)考2025屆七下英語期末監(jiān)測模擬試題含答案
- 正確跑步時間表
- 電商運營與推廣試卷
- 藝術(shù)史論古代藝術(shù)閱讀題
- 2025年忻州客運從業(yè)資格證考試題庫
- 肉毒桿菌培訓(xùn)
- 地理信息系統(tǒng)應(yīng)用與GIS分析試卷集
- 航空航天技術(shù)知識要點梳理
- 輔警筆試題庫100及答案
- 鐵芯電抗器設(shè)計
- 廉潔行醫(yī)專題培訓(xùn)課件
- 南通市如東縣醫(yī)療衛(wèi)生單位招聘事業(yè)編制工作人員筆試真題2024
- 歷史●甘肅卷丨2024年甘肅省普通高中學(xué)業(yè)水平等級性考試高考?xì)v史真題試卷及答案
- 2024年杭州市臨安區(qū)事業(yè)單位統(tǒng)一招聘真題
- C語言程序設(shè)計基礎(chǔ)知到智慧樹期末考試答案題庫2025年石河子大學(xué)
- 黨建考試試題及答案國企
- 小學(xué)圖書館面試題及答案
- 客運行業(yè)事故隱患內(nèi)部報告獎勵管理制度2025
評論
0/150
提交評論