版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
一維數(shù)組多維數(shù)組線性表順序表多項(xiàng)式稀疏矩陣字符串第二章數(shù)組一維數(shù)組定義
相同類(lèi)型的數(shù)據(jù)元素的集合。一維數(shù)組的示例與順序表的不同在于數(shù)組可以按元素的下標(biāo)直接存儲(chǔ)和訪問(wèn)數(shù)組元素。352749186054778341020123456789數(shù)組的定義和初始化#include<iostream.h>classszcl{inte; public:
szcl(){e=0;}
szcl(intvalue){e=value;} intget_value(){returne;} }main(){szcla1[3]={3,5,7},*elem;
for(inti=0;i<3;i++)
cout<<a1[i].get_value()<<“\n”;//靜態(tài)
elem=a1;
for(inti=0;i<3;i++){
cout<<elem->get_value()<<“\n”;//動(dòng)態(tài)
elem++;
}
return0;}
一維數(shù)組(Array)類(lèi)的定義
#include<iostream.h>#include<stdlib.h>template<classType>class
Array{Type*elements;//數(shù)組存放空間
intArraySize;//當(dāng)前長(zhǎng)度
voidgetArray();//建立數(shù)組空間
public:Array(intSize=DefaultSize);
Array(constArray<Type>&x);
~Array(){delete[]elements;} Array<Type>
&
operator=//數(shù)組復(fù)制
(constArray<Type>
&A);Type&operator[](inti); //取元素值
intLength()const{returnArraySize;}
//取數(shù)組長(zhǎng)度
voidReSize(intsz); //擴(kuò)充數(shù)組
}
template<classType>voidArray<Type>::getArray(){
//私有函數(shù):創(chuàng)建數(shù)組存儲(chǔ)空間
elements=newType[ArraySize];if(elements==NULL){
arraySize=0;cerr<<“存儲(chǔ)分配錯(cuò)!"<<
endl;return;}}一維數(shù)組公共操作的實(shí)現(xiàn)
template<classType>
Array<Type>::Array(intsz){
//構(gòu)造函數(shù)
if(sz<=0){
arraySize=0;cerr<<“非法數(shù)組大小”
<<endl;return;}
ArraySize=sz;getArray();
}
template<classType>Array<Type>::
Array(Array<Type>
&x){//復(fù)制構(gòu)造函數(shù)
intn=ArraySize=x.ArraySize;
elements=newType[n]; if(elements==NULL){
arraySize=0;cerr<<“存儲(chǔ)分配錯(cuò)”
<<endl;return;}
Type*srcptr=x.elements;
Type*destptr=elements;
while(n--)*destptr++=*srcptr++;}template<classType>Type&Array<Type>::operator[](inti){
//按數(shù)組名及下標(biāo)
i,取數(shù)組元素的值
if(i<0||i>ArraySize-1){
cerr<<“數(shù)組下標(biāo)超界”
<<endl;returnNULL;}
returnelements[i]; }
使用該函數(shù)于賦值語(yǔ)句
Pos=Position[i-1]+Number[i-1]
template<classType>voidArray<Type>::Resize(intsz){if(sz>=0&&sz!=ArraySize){Type*newarray=newType[sz];
//創(chuàng)建新數(shù)組
if(newarray==NULL){
cerr<<“存儲(chǔ)分配錯(cuò)”
<<endl;return;}intn=(sz<=ArraySize)?sz:ArraySize;
//按新的大小確定傳送元素個(gè)數(shù)
Type*srcptr=elements;//源數(shù)組指針
Type*destptr=newarray;//目標(biāo)數(shù)組指針
while(n--)*destptr++=*srcptr++;
//從源數(shù)組向目標(biāo)數(shù)組傳送
delete[]
elements; elements=newarray;
ArraySize=sz; }}
多維數(shù)組多維數(shù)組是一維數(shù)組的推廣多維數(shù)組是一種非線性結(jié)構(gòu)。其特點(diǎn)是每一個(gè)數(shù)據(jù)元素可以有多個(gè)直接前驅(qū)和多個(gè)直接后繼。數(shù)組元素的下標(biāo)一般具有固定的下界和上界,因此它比其他復(fù)雜的非線性結(jié)構(gòu)簡(jiǎn)單。
二維數(shù)組三維數(shù)組行向量下標(biāo)i頁(yè)向量下標(biāo)
i列向量下標(biāo)j行向量下標(biāo)
j
列向量下標(biāo)
k數(shù)組的連續(xù)存儲(chǔ)方式一維數(shù)組352749186054778341020123456789llllllllll
LOC(i)=LOC(i-1)+l=a+i*lLOC(i)=
LOC(i-1)+l=a+i*l,i>0
a,i=0
a+i*la
二維數(shù)組行優(yōu)先存放:
設(shè)數(shù)組開(kāi)始存放位置LOC(0,0)=a,每個(gè)元素占用d
個(gè)存儲(chǔ)單元
LOC(j,k)=a+(j*m+k)*d
二維數(shù)組列優(yōu)先存放:
設(shè)數(shù)組開(kāi)始存放位置LOC(0,0)=a,每個(gè)元素占用d
個(gè)存儲(chǔ)單元
LOC(j,k)=a+(k*n+j)*d
三維數(shù)組
各維元素個(gè)數(shù)為
m1,m2,m3
下標(biāo)為i1,i2,i3的數(shù)組元素的存儲(chǔ)地址:
(按頁(yè)/行/列存放)
LOC(i1,i2,i3)=a+(i1*m2*m3+i2*m3+i3
)*l
前i1頁(yè)總元素個(gè)數(shù)第i1頁(yè)的前i2行總元素個(gè)數(shù)第i2行前i3列元素個(gè)數(shù)
n維數(shù)組
各維元素個(gè)數(shù)為
m1,m2,m3,…,mn
下標(biāo)為i1,i2,i3,…,in
的數(shù)組元素的存儲(chǔ)地址:
LOC(i1,i2,…,in)=a+(i1*m2*m3*…*mn+i2*m3*m4*…*mn++……+in-1*mn+in
)*l
線性表(LinearList)線性表的定義和特點(diǎn)
定義
n(0)個(gè)數(shù)據(jù)元素的有限序列,記作
(a1,a2,…,an)
ai是表中數(shù)據(jù)元素,n是表長(zhǎng)度。
遍歷逐項(xiàng)訪問(wèn):
從前向后從后向前線性表的特點(diǎn)除第一個(gè)元素外,其他每一個(gè)元素有一個(gè)且僅有一個(gè)直接前驅(qū)。除最后一個(gè)元素外,其他每一個(gè)元素有一個(gè)且僅有一個(gè)直接后繼。a1a2a3a4a5a6順序表(SequentialList)順序表的定義和特點(diǎn)
定義將線性表中的元素相繼存放在一個(gè)連續(xù)的存儲(chǔ)空間中??衫靡痪S數(shù)組描述存儲(chǔ)結(jié)構(gòu)特點(diǎn)
線性表的順序存儲(chǔ)方式
遍歷順序訪問(wèn)
253457164809
012345data順序表(SeqList)類(lèi)的定義template<classType> classSeqList{Type*data;//順序表存儲(chǔ)數(shù)組
intMaxSize; //最大允許長(zhǎng)度
intlast; //當(dāng)前最后元素下標(biāo)public: SeqList(intMaxSize=defaultSize); ~SeqList(){delete[]data;}
intLength()const
{returnlast+1;
}
intFind(Type&x)const;//查找
intLocate(inti)const; //定位
intInsert(Type&x,inti);//插入
intRemove(Type
&x); //刪除
intNext(Type
&x); //后繼
intPrior(Type
&x);//前驅(qū)
intIsEmpty(){returnlast==-1;
} intIsFull(){returnlast==MaxSize-1;
}TypeGet(inti){//提取
returni<0||i>last?NULL:data[i];}}
順序表部分公共操作的實(shí)現(xiàn)
template<classType>
//構(gòu)造函數(shù)
SeqList<Type>::SeqList(intsz){if(sz>0){ MaxSize=sz;last=-1; data=newType[MaxSize];
if(data==NULL){MaxSize=0;last=-1;return;}
}}template<classType> intSeqList<Type>::Find(Type
&x)const{//搜索函數(shù):在順序表中從頭查找結(jié)點(diǎn)值等于//給定值x的結(jié)點(diǎn)
inti=0;
while(i<=last&&data[i]!=x)i++;
if(i>last)return
-1;
elsereturni; }順序搜索圖示253457164809
012345data搜索
16i253457164809
i253457164809
i253457164809
i搜索成功2534571648
01234data搜索50i2534571648
i2534571648
i2534571648
i2534571648
i搜索失敗搜索成功的平均比較次數(shù)
若搜索概率相等,則
搜索不成功數(shù)據(jù)比較n
次表項(xiàng)的插入2534571648096301234567data50插入x253457501648096301234567data50itemplate<classType>intSeqList<Type>::Insert(Type&x,inti){//在表中第
i個(gè)位置插入新元素
x
if(i<0
||
i>last+1
||
last==MaxSize-1)
return0;//插入不成功
else{last++;
for(intj=last;j>i;j--)data[j]=data[j-1]; data[i]=x;return1;//插入成功
}}表項(xiàng)的刪除253457501648096301234567data16刪除
x2534575048096301234567data
template<classType>intSeqList<Type>::Remove(Type&x){
//在表中刪除已有元素
x
inti=Find(x); //在表中搜索
x
if(i>=0){ last--
;
for(intj=i;j<=last;j++)data[j]=data[j+1];
return1; //成功刪除
} return0;//表中沒(méi)有
x}順序表的應(yīng)用:集合的“并”運(yùn)算voidUnion(SeqList<int>
&A,SeqList<int>
&B){
intn=A.Length();
intm=B.Length();
for(inti=0;i<m;i++){ intx=B.Get(i);//在B中取一元素
intk=A.Find(x);//在A中搜索它
if(k==
-1)//若未找到插入它
{A.Insert(n,x);n++;}}}voidIntersection(SeqList<int>
&A,SeqList<int>
&B){
intn=A.Length();
intm=B.Length();inti=0;
while(i<n){intx=A.Get(i);//在A中取一元素
intk=B.Find(x);//在B中搜索它
if(k==-1){A.Remove(i);n--;} elsei++;//未找到在A中刪除它
}}順序表的應(yīng)用:集合的“交”運(yùn)算多項(xiàng)式(Polynomial)n階多項(xiàng)式Pn(x)有n+1項(xiàng)。
系數(shù)a0,a1,a2,…,an
指數(shù)0,1,2,…,n。按升冪排列classPolynomial{public:Polynomial();//構(gòu)造函數(shù)
intoperator!();//判是否零多項(xiàng)式
floatCoef(inte);
intLeadExp();//返回最大指數(shù)
Polynomial
Add(Polynomial
poly);PolynomialMult(Polynomialpoly);
floatEval(floatx); //求值}多項(xiàng)式(Polynomial)的抽象數(shù)據(jù)類(lèi)型
#include<iostream.h>classpower{
doublex;
inte;
doublemul;
public:
power(doubleval,intexp);
//構(gòu)造函數(shù)
doubleget_power(){returnmul;}//取冪值
};創(chuàng)建power類(lèi),計(jì)算x的冪
power::power(doubleval,intexp){
//按val值計(jì)算乘冪
x=val;e=exp;mul=1.0;
if(exp==0)return;
for(;exp>0;exp--)mul=mul*x;
}main(){powerpwr(1.5,2);
cout<<pwr.get_power()<<“\n”;
}
多項(xiàng)式的存儲(chǔ)表示第一種:
private:(靜態(tài)數(shù)
intdegree; 組表示)
floatcoef[maxDegree+1];
Pn(x)可以表示為:
pl.degree=n pl.coef[i]=ai,0ina0
a1
a2……an………012degreemaxDegree-1coefn第二種:private:
(動(dòng)態(tài)數(shù)
intdegree;組表示)
float*coef; Polynomial::Polynomial(intsz){ degree=sz; coef=newfloat[degree+1];
}
以上兩種存儲(chǔ)表示適用于指數(shù)連續(xù)排列的多項(xiàng)式。但對(duì)于指數(shù)不全的多項(xiàng)式如
P101(x)=3+5x50-14x101,不經(jīng)濟(jì)。第三種:
class
Polynomial; classterm{
//多項(xiàng)式的項(xiàng)定義
friendPolynomial;
private:
floatcoef;//系數(shù)
intexp; //指數(shù)
};a0
a1
a2……ai……ame0
e1
e2……ei
……emcoefexp012i
mclass
Polynomial{//多項(xiàng)式定義public:……private:
statictermtermArray[MaxTerms];//項(xiàng)數(shù)組
staticintfree;//當(dāng)前空閑位置指針
//termPolynomial::termArray[MaxTerms];//intPolynomial::free=0;
intstart,finish; //多項(xiàng)式始末位置
}
A(x)=2.0x1000+1.8
B(x)=1.2+51.3x50+3.7x101
兩個(gè)多項(xiàng)式存放在termArray中A.startA.finishB.startB.finishfreecoefexp1.82.0……01000050101……maxTerms兩個(gè)多項(xiàng)式的相加結(jié)果多項(xiàng)式另存掃描兩個(gè)相加多項(xiàng)式,若都未檢測(cè)完:
若當(dāng)前被檢測(cè)項(xiàng)指數(shù)相等,系數(shù)相加。若未變成0,則將結(jié)果加到結(jié)果多項(xiàng)式。若當(dāng)前被檢測(cè)項(xiàng)指數(shù)不等,將指數(shù)小者加到結(jié)果多項(xiàng)式。若有一個(gè)多項(xiàng)式已檢測(cè)完,將另一個(gè)多項(xiàng)式剩余部分復(fù)制到結(jié)果多項(xiàng)式。PolynomialPolynomial::operator+(PolynomialB){PolynomialC;inta=start;
intb=B.start;C.start=free;
floatc;
while(a<=finish&&b<=B.finish)
Switch(compare(termArray[a].exp,termArray[b].exp)){//比較對(duì)應(yīng)項(xiàng)指數(shù)
case‘=’://指數(shù)相等
c=termArray[a].coef+//系數(shù)相加
termArray[b].coef;if(c)NewTerm(c,termArray[a].exp);a++;b++;
break;
case‘>’:
//b指數(shù)小,建立新項(xiàng)
NewTerm(termArray[b].coef,termArray[b].exp);
b++;
break;
case'<':
//a指數(shù)小,建立新項(xiàng)
NewTerm(termArray[a].coef,termArray[a].exp);
a++;
}for(;a<=finish;a++)//a未檢測(cè)完時(shí)
NewTerm(termArray[a].coef,termArray[a].exp
);
for(
;
b<=B.finish;b++)//b未檢測(cè)完時(shí)
NewTerm(termArray[b].coef,termArray[b].exp);C.finish=free-1;
returnC;}
在多項(xiàng)式中加入新的項(xiàng)
voidPolynomial::NewTerm(floatc,inte){
//把一個(gè)新的項(xiàng)加到多項(xiàng)式C(x)中
if(free>=maxTerms){cout<<"Toomanytermsinpolynomials”<<endl;return;
}termArray[free].coef=c;
termArray[free].exp=e;
free++;}
稀疏矩陣
(SparseMatrix)非零元素個(gè)數(shù)遠(yuǎn)遠(yuǎn)少于矩陣元素個(gè)數(shù)稀疏矩陣的定義設(shè)矩陣Amn
中有
t個(gè)非零元素,若t遠(yuǎn)遠(yuǎn)小于矩陣元素的總數(shù)mn,則稱(chēng)矩陣A為稀疏矩陣。為節(jié)省存儲(chǔ)空間,應(yīng)只存儲(chǔ)非零元素。非零元素的分布一般沒(méi)有規(guī)律,應(yīng)在存儲(chǔ)非零元素時(shí),同時(shí)存儲(chǔ)該非零元素的行下標(biāo)row、列下標(biāo)
col、值
value。每一個(gè)非零元素由一個(gè)三元組唯一確定:
(行號(hào)row,列號(hào)col,值value)稀疏矩陣的抽象數(shù)據(jù)類(lèi)型template<classType>classSparseMatrix;template<classType>classTrituple{ //三元組friendclassSparseMatrix<Type>private:
introw,col; //非零元素行號(hào)/列號(hào)
Typevalue;//非零元素的值}
template<classType>classSparseMatrix{//稀疏矩陣類(lèi)定義
intRows,Cols,Terms;//行/列/非零元素?cái)?shù)
Trituple<Type>smArray[MaxTerms];
public://三元組表
SparseMatrix(intMaxRow,intMaxcol);
SparseMatrix<Type>&Transpose(SparseMatrix<Type>&);//轉(zhuǎn)置
SparseMatrix<Type>&Add(SparseMatrix
<Type>a,SparseMatrix<Type>b);//相加
SparseMatrix<Type>&Multiply(SparseMatrix
<Type>a,SparseMatrix<Type>b);//相乘}
稀疏矩陣的轉(zhuǎn)置一個(gè)mn
的矩陣A,它的轉(zhuǎn)置矩陣B是一個(gè)nm
的矩陣,且A[i][j]=B[j][i]。即矩陣A的行成為矩陣B的列,矩陣A的列成為矩陣B的行。在稀疏矩陣的三元組表中,非零矩陣元素按行存放。當(dāng)行號(hào)相同時(shí),按列號(hào)遞增的順序存放。稀疏矩陣的轉(zhuǎn)置運(yùn)算要轉(zhuǎn)化為對(duì)應(yīng)三元組表的轉(zhuǎn)置。稀疏矩陣轉(zhuǎn)置矩陣用三元組表表示的稀疏矩陣及其轉(zhuǎn)置稀疏矩陣轉(zhuǎn)置算法思想設(shè)矩陣列數(shù)為Cols,對(duì)矩陣三元組表掃描Cols次。第k次檢測(cè)列號(hào)為k的項(xiàng)。第k次掃描找尋所有列號(hào)為k
的項(xiàng),將其行號(hào)變列號(hào)、列號(hào)變行號(hào),順次存于轉(zhuǎn)置矩陣三元組表。稀疏矩陣的轉(zhuǎn)置
template<classType>SparseMatrix<Type>&SparseMatrix<Type>::Transpose(SparseMatrix<Type>&a){SparseMatrix<Type>b(a.Cols,a.Rows);b.Rows=a.Cols;b.Cols=a.Rows;
b.Terms=a.Terms;
//轉(zhuǎn)置矩陣的列數(shù),行數(shù)和非零元素個(gè)數(shù)
if(a.Terms>0){
intCurrentB=0;
//轉(zhuǎn)置三元組表存放指針
for(int
k=0;k<a.Cols;k++)
//對(duì)所有列號(hào)處理一遍
for(inti=0;i<a.Terms;i++)
if(a.smArray[i].col==k){ b.smArray[CurrentB].row=k;
b.smArray[CurrentB].col=a.smArray[i].row;
b.smArray[CurrentB].value=a.smArray[i].value;
CurrentB++;
}
}
returnb;}快速轉(zhuǎn)置算法設(shè)矩陣三元組表總共有t項(xiàng),上述算法的時(shí)間代價(jià)為O(n*t)。若矩陣有200行,200列,10,000個(gè)非零元素,總共有2,000,000次處理。為加速轉(zhuǎn)置速度,建立輔助數(shù)組rowSize
和rowStart,記錄矩陣轉(zhuǎn)置后各行非零元素個(gè)數(shù)和各行元素在轉(zhuǎn)置三元組表中開(kāi)始存放位置。掃描矩陣三元組表,根據(jù)某項(xiàng)列號(hào),確定它轉(zhuǎn)置后的行號(hào),查rowStart
表,按查到的位置直接將該項(xiàng)存入轉(zhuǎn)置三元組表中
for(inti=0;i<a.Cols;i++)
rowSize[i]=0; for(i=0;i<a.Terms;i++)
rowSize[a.smArray[i].col]++;
rowStart[0]=0; for(i=1;i<Cols;i++) rowStart[i]=rowStart[i-1]+rowSize[i-1];稀疏矩陣的快速轉(zhuǎn)置template<classType>SparseMatrix<Type>&SparseMatrix<Type>::FastTranspos(SparseMatrix<Type>&a){
int*rowSize=newint[a.Cols];
int*rowStart=newint[a.Cols];SparseMatrix<Type>b(a.Cols,a.Rows);b.Rows=a.Cols;b.Cols=a.Rows;
b.Terms=a.Terms;if(a.Terms>0){for(inti=0;i<Cols;i++)rowSize[i]=0;
for(i=0;i<Terms;i++)rowSize[smArray[i].col]++;
rowStart[0]=0;
for(i=1;i<a.Cols;i++) rowStart[i]=rowStart[i-1]+rowSize[i-1]; for(i=0;i<a.Terms;i++){ intj=rowStart[a.smArray[i].col]; b.smArray[j].row=a.smArray[i].col; b.smArray[j].col=a.smArray[i].row; b.smArray[j].value=a.smArray[i].value; rowStart[a.smArray[i].col]++;
}}
delete[]rowSize;
delete[]rowStart;
returnb;}字符串(String)字符串是n(0)個(gè)字符的有限序列,記作S:“c1c2c3…cn”
其中,S是串名字
“c1c2c3…cn”是串值
ci是串中字符
n是串的長(zhǎng)度。例如,S=“TsinghuaUniversity”
constintmaxLen=128;
classString{intcurLen;//串的當(dāng)前長(zhǎng)度
char*ch;//串的存儲(chǔ)數(shù)組
public:String(constString&ob);String(constchar*init);String(
);~String(){delete[]ch;}
字符串抽象數(shù)據(jù)類(lèi)型和類(lèi)定義
intLength()const{
returncurLen;}
//求當(dāng)前串*this的實(shí)際長(zhǎng)度
String&operator()(intpos,intlen);
//取*this從pos開(kāi)始len個(gè)字符組成的子串
intoperator==(constString&ob){returnstrcmp(ch,ob.ch)==0;}
//判當(dāng)前串*this與對(duì)象串ob是否相等
intoperator!=(constString&ob)const{returnstrcmp(ch,ob.ch)!=0;}
//判當(dāng)前串*this與對(duì)象串ob是否不等
intoperator!()
const
{returncurLen==0;}
//判當(dāng)前串*this是否空串
String&operator=(String&ob);
//將串ob賦給當(dāng)前串*thisString&operator+=(String&ob);
//將串ob連接到當(dāng)前串*this之后
char&operator[](inti);
//取當(dāng)前串*this的第i個(gè)字符
intFind(String&pat)const;}
String::String(constString&ob){
//復(fù)制構(gòu)造函數(shù):從已有串ob復(fù)制
ch=newchar[maxLen+1];//創(chuàng)建串?dāng)?shù)組
if(ch==NULL){
cerr<<“存儲(chǔ)分配錯(cuò)!
\n”;
exit(1);
}curLen=ob.curLen;//復(fù)制串長(zhǎng)度
strcpy(ch,ob.ch);//復(fù)制串值
}
字符串部分操作的實(shí)現(xiàn)String::String(const
char*init){//復(fù)制構(gòu)造函數(shù):從已有字符數(shù)組*init復(fù)制
ch=newchar[maxLen+1];//創(chuàng)建串?dāng)?shù)組
if(ch==NULL){cerr<<“存儲(chǔ)分配錯(cuò)!
\n”;
exit(1);
}curLen=strlen(init);
//復(fù)制串長(zhǎng)度
strcpy(ch,init);
//復(fù)制串值
}String::String(
){//構(gòu)造函數(shù):創(chuàng)建一個(gè)空串
ch=newchar[maxLen+1];//創(chuàng)建串?dāng)?shù)組
if(ch==NULL){
cerr<<“存儲(chǔ)分配錯(cuò)!\n”;
exit(1);}curLen=0;ch[0]=‘\0’;}提取子串的算法示例pos+len-1 pos+len-1curLen-1curLeninfinityinfinitypos=2,len=3pos=5,len=4finity超出String&String::operator()(intpos,intlen){//從串中第
pos個(gè)位置起連續(xù)提取
len個(gè)字符//形成子串返回
String*temp=newString;//動(dòng)態(tài)分配
if(pos<0||pos+len-1>=maxLen||len<0){
temp->curLen=0;
//返回空串
temp->ch[0]='\0';
}
else{//提取子串
if(pos+len-1>=curLen)len=curLen-pos;
temp->curLen=len;//子串長(zhǎng)度
for(inti=0,j=pos;i<len;i++,j++) temp->ch[i]=ch[j];//傳送串?dāng)?shù)組
temp->ch[len]=‘\0’;//子串結(jié)束
}
return*temp;}
例:串
st=“university”,
pos=3,len=4使用示例
subSt=st(3,4)提取子串
subSt=“vers”String&String::operator=(String&ob){//串賦值:從已有串ob復(fù)制
if(&ob!=this){
delete[]ch; ch=new
char[maxLen+1];//重新分配
if(ch==NULL)
{cerr<<“內(nèi)存不足!\n”;
exit(1);}curLen=ob.curLen;//串復(fù)制
strcpy(ch,ob.ch);
}elsecout<<“字符串自身賦值出錯(cuò)!\n”;
return*this;}char&String::operator[](inti){//按串名提取串中第i個(gè)字符
if(i<0&&i>=curLen
){cout<<“串下標(biāo)超界!\n”;
exit(1);}returnch[i];}例:串
st=“university”,使用示例
newSt=st;newChar=st[1];數(shù)組賦值
newSt=“university”提取字符
newChar=
‘n’String&String::operator+=(String&ob){//串連接
char*temp=ch;//暫存原串?dāng)?shù)組
curLen+=ob.curLen;//串長(zhǎng)度累加
ch=new
char[maxLen+1];
if(ch==NULL){cerr<<“存儲(chǔ)分配錯(cuò)!\n”;
exit(1);}strcpy(ch,temp);
//拷貝原串?dāng)?shù)組
strcat(ch,ob.ch);
//連接ob串?dāng)?shù)組
delete[]temp;return
*this;
}例:串st1=“beijing”,st2=“university”,使用示例
st1+=st2;連接結(jié)果
st1=“beijinguniversity”st2=“university”串的模式匹配定義在串中尋找子串(第一個(gè)字符)在串中的位置詞匯在模式匹配中,子串稱(chēng)為模式,串稱(chēng)為目標(biāo)。示例
目標(biāo)T:“Beijing”
模式P:“jin”
匹配結(jié)果=3
第1趟
T abbaba窮舉的模式
P aba
匹配過(guò)程
第2趟
T abbaba P
aba
第3趟
T abbaba P
aba
第4趟
T abba
ba Pa
ba
intString::Find(String&pat)const{
//窮舉的模式匹配
char*p=pat.ch,*s=ch;
inti=0;
if(*p&&*s) //當(dāng)兩串未檢測(cè)完
while(i<=curLen-pat.curLen)
if(*p++==*s++)//比較串字符
if(!*p)returni;//相等
else{i++;s=ch+i;p=pat.ch;}
//對(duì)應(yīng)字符不相等,對(duì)齊目標(biāo)的
//下一位置,繼續(xù)比較
return
-1; }
目標(biāo)
T
t0
t1
t2……tm-1…tn-1
模式
pat
p0
p1
p2……pm-1
目標(biāo)
T
t0
t1
t2……tm-1
tm…tn-1
模式
pat
p0
p1……pm-2pm-1
目標(biāo)
T
t0
t1……ti
ti+1……ti+m-2
ti+m-1…tn-1 ‖‖‖‖
模式
pat
p0
p1……pm-2pm-1改進(jìn)的模式匹配
窮舉的模式匹配算法時(shí)間代價(jià):最壞情況比較n-m+1趟,每趟比較m次,總比較次數(shù)達(dá)(n-m+1)*m
原因在于每趟重新比較時(shí),目標(biāo)串的檢測(cè)指針要回退。改進(jìn)的模式匹配算法可使目標(biāo)串的檢測(cè)指針每趟不回退。
改進(jìn)的模式匹配(KMP)算法的時(shí)間代價(jià):若每趟第一個(gè)不匹配,比較n-m+1趟,總比較次數(shù)最壞達(dá)(n-m)+m=n
若每趟第m個(gè)不匹配,總比較次數(shù)最壞亦達(dá)到nTt0
t1…ts-1
ts
ts+1
ts+2…ts+j-1
ts+j
ts+j+1…tn-1
‖‖‖‖‖P
p0
p1
p2…pj-1
pjpj+1
則有
tsts+1
ts+2…ts+j
=p0
p1
p2…pj(1)
為使模式P與目標(biāo)T匹配,必須滿(mǎn)足
p0
p1
p2…pj-1…pm-1
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年租賃合同履約保證
- 2024年度地基買(mǎi)賣(mài)合同協(xié)議書(shū)(全面版)3篇
- 2025版城市公共服務(wù)設(shè)施運(yùn)營(yíng)管理合同規(guī)范文本3篇
- 2025版辣椒種植產(chǎn)業(yè)鏈一體化合作協(xié)議3篇
- 電子鐘課程設(shè)計(jì)報(bào)告
- 楊柳市構(gòu)造地質(zhì)課程設(shè)計(jì)
- 2025年度教育培訓(xùn)機(jī)構(gòu)教職工勞動(dòng)合同規(guī)范模板2篇
- 2025至2030年中國(guó)輕油燃燒機(jī)行業(yè)投資前景及策略咨詢(xún)研究報(bào)告
- 算法及其描述的課程設(shè)計(jì)
- 2025版酒吧服務(wù)員職業(yè)發(fā)展計(jì)劃與雇傭協(xié)議3篇
- 【苯乙烯-丙烯酸酯乳液聚合裝置工藝設(shè)計(jì)與實(shí)現(xiàn)(論文)】
- 2022年安徽省公務(wù)員錄用考試《行測(cè)》題
- 基于MATLAB的硬幣計(jì)數(shù)設(shè)計(jì)
- 教代會(huì)會(huì)場(chǎng)背景(紅旗)圖片課件
- 腦出血護(hù)理查房-中醫(yī)院
- 森林生態(tài)系統(tǒng)固碳現(xiàn)狀、速率、機(jī)制和潛力研究實(shí)施方案細(xì)則
- 料神外貿(mào)老鳥(niǎo)之路201407全整理
- 中醫(yī)科運(yùn)用PDCA循環(huán)提高中醫(yī)特色治療室消毒合格率PDCA成果匯報(bào)
- 神經(jīng)內(nèi)科年度發(fā)展規(guī)劃
- 公眾責(zé)任保險(xiǎn)知識(shí)培訓(xùn)教育課件
- 你演我猜-題庫(kù)19091
評(píng)論
0/150
提交評(píng)論