串和數組精選課件_第1頁
串和數組精選課件_第2頁
串和數組精選課件_第3頁
串和數組精選課件_第4頁
串和數組精選課件_第5頁
已閱讀5頁,還剩49頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第5章串和數組串也可以看作是一種線性表,只是其操作通常是按成組的元素來進行的。數組可以認為是線性表在維數上的一種拓展。串和數組依然屬于線性結構,但在存儲結構的實現方面較線性表為復雜。值得注意的是,串和數組是在高級語言層面已經實現的數據類型,在數據結構中再討論它們是為了深入理解實現它們的基礎技術。講授本章課程大約需4課時。1第5章串和數組串也可以看作是一種線性表,只是其操作通

5.1串的定義和操作5.2串的表示和實現

5.3正文模式匹配5.4正文編輯━串操作應用舉例25.1串的定義和操作25.1串的定義和操作35.1串的定義和操作3串的定義:

串(String),或稱字符串是由零個或多個字符組成的有限序列。記作:S=a0a1…ai…an-1

(n≥0)

其中,ai屬于字符集,n為串的長度,當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是字符串常量。

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

7StrAssign(&T,chars)7

StrCopy(&T,S)

初始條件:串S存在。

操作結果:由串S復制得串T。8

StrCopy(&T,SDestroyString(&S)

初始條件:串S存在。

操作結果:串S被銷毀。9DestroyString(&S)9

表示空串,空串的長度為零

StrEmpty(S)

初始條件:串S存在。

操作結果:若S為空串,則返回TRUE,否則返回FALSE。

表示空格,長度為1的字符串10表示空串,空串的長度

StrCompare(S,T)

初始條件:串S和T存在。

操作結果:若ST,則返回值0;

若ST,則返回值0;

若ST,則返回值0。例如:StrCompare(data,state)<0StrCompare(cat,case)>011StrCompare(

StrLength(S)

初始條件:串S存在。

操作結果:返回S的元素個數,

稱為串的長度。12StrLength(S)

Concat(&T,S1,S2)

初始條件:串S1和S2存在。

操作結果:用T返回由S1和S2

聯接而成的新串。例如:Concate(T,man,kind)

求得T=mankind13Concat(&T,S1,S2)

SubString(&Sub,S,pos,len)初始條件:

串S存在,0≤pos<StrLength(S)且0≤len≤StrLength(S)-pos。操作結果:

用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)=起始位置和子串長度之間存在約束關系長度為0的子串為“合法”串16SubString(sub,commander,

Index(S,T,pos)

初始條件:串S和T存在,T是非空串,

0≤pos≤StrLength(S)-1。

操作結果:

若主串S中存在和串T值相同

的子串,則返回它在主串S中第pos個

字符之后第一次出現的位置;

否則函數值為-1。

17Index(S,T,假設S=abcaabcaaabca,T=bca

Index(S,T,1)=1;Index(S,T,3)=5;Index(S,T,11)=-1;

“子串在主串中的位置”意指子串中的第一個字符在主串中的位序。18假設S=abcaabcaaabca,T=

Replace(&S,T,V)

初始條件:串S,T和V均已存在,

且T是非空串。

操作結果:

用V替換主串S中出現

的所有與(模式串)T

相等的不重疊的子串。19

Replace(&S,T,V例如:假設S=abcaabcaaabca,T=bca若V=

x,則經置換后得到S=axaxaax若V=bc,則經置換后得到S=abcabcaabc20例如:假設S=abcaabcaaabca,T

StrInsert(&S,pos,T)

初始條件:串S和T存在,1≤pos≤StrLength(S)。

操作結果:在串S的第pos個字符之前插入串T。例如:S=chater,T=rac,則執行StrInsert(S,4,T)之后得到S=character21StrInsert(&S,pos,T)

StrDelete(&S,pos,len)

初始條件:串S存在

1≤pos≤StrLength(S)-len。

操作結果:從串S中刪除位置pos

起長度為len的子串。

22StrDelete(&S,pos,lenClearString(&S)

初始條件:串S存在。

操作結果:將S清為空串。

23ClearString(&S)

初始條件:

對于串的基本操作集可以有不同的定義方法,在使用高級程序設計語言中的串類型時,應以該語言的參考手冊為準。

gets(str)輸入一個串;

puts(str)

輸出一個串;

strcat(str1,str2)串聯接函數;

strcpy(str1,str2)

串復制函數;

strcmp(str1,str2)串比較函數;

strlen(str)求串長函數;

char*strstr(char*s,char*sub)

如果找到子串,返回該位置的指針。如果找不到,則返回空指針。-C語言程序設計-附錄C例如:C語言函數庫中提供下列串處理函數:24對于串的基本操作集可以有不同的定義方法,在使用高級在上述串類型定義的13種操作中,串賦值StrAssign、串復制Strcopy、串比較StrCompare、求串長StrLength、串聯接Concat以及求子串SubString等六種操作構成串類型的最小操作子集。

即:這些操作不可能利用其他串操作來實現,反之,其他串操作(除串清除ClearString和串銷毀DestroyString外)可在這個最小操作子集上實現。25在上述串類型定義的13種操作中,25例如,可利用串比較、求串長和求子串等操作實現定位函數Index(S,T,pos)。pos<=i<=n-mSubString(sub,S,i,StrLength(T))StrCompare(sub,T)

?

0

S串T串

T串iposn-m算法的基本思想為:26例如,可利用串比較、求串長和求子串等操作實現定位函數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串的邏輯結構和線性表極為相似,區別僅在于串的數據對象約束為字符集。

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

在線性表的基本操作中,大多以“單個元素”作為操作對象;在串的基本操作中,通常以“串的整體”作為操作對象。28串的邏輯結構和線性表極為相似,區別串的基本操5.2串的表示和實現295.2串的表示和實現29在程序設計語言中,串只是作為輸入或輸出的常量出現,則只需存儲此串的串值,即字符序列即可。但在多數非數值處理的程序中,串也以變量的形式出現。30在程序設計語言中,串只是作為輸入或輸出的常量出現,則一、串的定長順序存儲表示二、串的堆分配存儲表示三、串的塊鏈存儲表示(在存儲結構的層面討論串的操作)31一、串的定長順序存儲表示二、串的堆分配存儲表示三、串的塊鏈存一、串的定長順序存儲表示

如果利用C語言的串類型描述算法,可用一組連續的存儲單元存放串的字符序列,并以‘\0’為結束標志。使用C語言的字符數組來存儲字符串。如,chars[]="abc";//字符串的長度為3chara[10];//字符串最大串長為9

32一、串的定長順序存儲表示如果利用C語言的串類型描述算法

按這種串的表示方法實現的串的運算時,其基本操作為“字符序列的復制”串的實際長度可在這個預定義長度的范圍內隨意設定,超過預定義長度的串值則被舍去,稱之為“截斷”串的定長順序存儲操作特點:33按這種串的表示方法實現的串的運算時,其基本操作為“字符序void

concat_sq(char

s1[],char

s2[],char

t[

])

{

int

j=0,k=0;

while(s1[j]!='\0')

t[k++]=s1[j++];//復制S1

j=0;

while(s2[j]!=‘\0’)t[k++]=s2[j++];

//接著復制S2

t[k]='\0';//增加結束符}例如:串的聯接操作concat34voidconcat_sq(chars1[],charvoidmain(){

char

s1[]="china";

char

s2[]="beijing";

char

t1[13];

//順序分配定長空間

concat(s1,s2,t1); cout<<t1<<endl;}定長分配體現在調用程序35voidmain(){定長分配體現在調用程序35typedefstruct{char*ch;

//若是非空串,則按串長分配存儲區,//否則ch為NULL

int

length;//串長度

}

HString;二、串的堆分配存儲表示如果完全用偽碼描述算法,可進行類型定義:36typedefstruct{二、串的堆分配存儲表示如果直接用C語言描述算法,可通過函數new和delete為用戶進行串值空間的動態管理,為每一個新產生的串分配一個存儲區,稱串值共享的存儲空間為“堆”。

本書采用這種方式。

這類串操作實現的常用思路:先為新生成的串分配一個存儲空間,然后進行串值的復制。37如果直接用C語言描述算法,可通過函數new和deleconcat

操作substring

操作串的堆分配存儲表示實現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;}調用程序無需預先申請空間40voidmain(){調用程序無需預先申請空間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(“參數不合法”);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)在實際應用中,串的匹配查找操作使用的機會很多,現專門討論該算法。使用串的有關操作實現了INDEX,但在效率上仍有改進的余地。43先前,曾介紹過串匹配(查找)的操作INDEX(S,T

簡單算法(簡單的正文模式匹配算法)

以定長順序結構表示串abaacababaacbcaababaacbaabaacabaacST演示模型:匹配成功!44簡單算法(簡單的正文模式匹配算法)abaacababaacint

Index_BF(charS[],charT[],intpos){

//返回子串T在主串S中第pos個字符之后的位置。若不存在,//則函數值為-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++;//繼續比較后繼字符

else

{i++;j=0;}

//重新開始新一輪的匹配

if(T[j]!=‘\0’)returni;

elsereturn-1;}//Index_BF45intIndex_BF(charS[],charT[若找到S中所有和模式串T匹配的子串,只需多次調用Index_BF(charS[],charT[],intpos)匹配成功后,下一次的匹配起始位置為i+Strlength(T)Index_BF不是最精巧的模式匹配算法,但比較好理解,適合于一般的使用。46若找到S中所有和模式串T匹配的子串,只需多次調用Inde5.4正文編輯

━串操作應用舉例47

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論