数据结构之 字符串

来源:互联网 发布:3g手机可以用4g网络吗 编辑:程序博客网 时间:2024/05/07 05:50

#ifndef BEFUN
#define oopr(msg,flag) {puts(msg);return flag;}
#define oor(msg) {puts(msg);return;}
#define oope(msg,flag) {perror(msg);return flag;}
#endif

class String{
private:
    
char *str;
    
int len;
public:
    String(
char *);
    
~String();
    
void operator =(String &);
    
void operator +=(String &);
    
bool operator ==(String &);
    
char * subStr(int,int);
    
int find(char,int);
    
bool ins(char *,int);
    
bool del(int,int);
    
void match(char *,int *);
    
void show();
    
void free();
    
void replace(char *);
    
int find(char *,int *);
    
int find(char *);
}
;





bool String::ins(char *ch,int index){
    
if(index<0 || index>len)  oopr("ins err: parameter error",false);
    
char *temp;
    
int chlen=strlen(ch);
    temp
=new char[len+chlen+1];
    
if(temp==NULL) oopr("ins err: parameter error",false);
    memcpy(temp,str,index);
    memcpy(temp
+index,ch,chlen);
    memcpy(temp
+index+chlen,str+index,len-index);
    chlen
=len+chlen;
    temp[chlen]
=0;
    free();
    len
=chlen;
    str
=temp;
    
return true;
}


int String::find(char c,int index){
    
for(int i=index-1;i<len;i++)
        
if(str[i]==c) return i+1;
    
return -1;
}


char * String::subStr(int index,int count){
    
if(index<1 || index>count || index>count || index+count>len+1) oopr("substr err, parameter error",NULL);
    
char *temp=new char[count+1];
    
if(!temp) oopr("substr err: no enough memery",NULL);
    memcpy(temp,str
+index-1,count);
    temp[count]
=0;
    
return temp;
}


bool String::del(int index,int count){
    
if(index<0 || index>count || index>count || index+count>len) oopr("substr err, parameter error",NULL);
    
int chlen=len-count;
    
char *temp=new char[chlen+1];
    
if(!temp) oopr("del err: no enough memery",false);
    memcpy(temp,str,index);
    memcpy(temp
+index,str+index+count,len-index-count);
    temp[chlen]
=0;
    free();
    len
=chlen;
    str
=temp;
    
return true;
}





void String::operator +=(String &s){
    
char *temp=new char[len+s.len+1];
    
if(temp==NULL) return;
    
if(!strcpy(temp,str)) return;
    
if(!strcat(temp,s.str)) return;
    
int l=len;
    free();
    str
=temp;
    len
=l+s.len;
}
    


void String::operator =(String &s){
    
if(s==*thisreturn;
    
char *temp;
    temp
=new char[s.len+1];
    
if(!temp) return;
    
if(!strcpy(temp,s.str)) return;
    free();
    str
=temp;
    len
=s.len;
}



bool String::operator ==(String & s){
    
if(len!=s.len) return false;
    
if(strcmp(str,s.str)) return false;
    
return true;
}


void String::free(){
    len
=0;
    delete [] str;
    str
=NULL;
}



String::
~String(){
    free();
}


void String::show(){
    cout
<<"len= "<<len<<" "<<str<<endl;
}


String::String(
char *chr){
    
if(chr==NULL) return;
    str
=new char[strlen(chr)+1];
    
if(str==NULL) oor("no enough memery");
    len
=strlen(chr);
    strcpy(str,chr);
}


void String::match(char *chr,int *pre){
    
int i,k,loc,len;
    len
=strlen(chr);
    pre[
0]=-1;
    
for(i=1;i<len;i++){
        k
=i-1;
        
while(1){
            loc
=pre[k];
            
if(chr[i]==chr[loc+1])    {pre[i]=loc+1;break;}
            
else if(loc==-1)        {pre[i]=-1;break;}
            
else {k=loc;}
        }

    }

    
for(i=0;i<len;i++)
        
if(pre[i]==-1) pre[i]=0;
    
#ifdef MATCH
    
for(i=0;i<len;i++)
        cout
<<i<<" ";
    cout
<<endl;
    
    
for(i=0;i<len;i++)
        cout
<<chr[i]<<" ";
    cout
<<endl;
    
    
for(i=0;i<len;i++)
        cout
<<pre[i]<<" ";
    cout
<<endl;
#endif
}


int String::find(char *chr,int *pre){
    
int chrlen,i,loc;
    chrlen
=strlen(chr);
    
for(i=loc=0;i<len && loc<chrlen;i++){
        
if(str[i]==chr[loc]) loc++;
        
else {if(loc!=0--i;;loc=pre[loc];}
    }

    
if(loc==chrlen) return i-chrlen+1;
    
return -1;
}


int String::find(char *chr){
    
int *pre,result;
    pre
=new int[strlen(chr)];
    match(chr,pre);
    result
=find(chr,pre);
    
return result;
}




void String::replace(char *chr){
    
int *pre,loc,bef,chrlen;
    
char *tmp=str,*buf;
    chrlen
=strlen(chr);
    pre
=new int[chrlen];
    buf
=new char[len];
    match(chr,pre);
    bef
=0;
    
while((loc=find(chr,pre))!=-1){
        
--loc;
        memcpy(buf
+bef,str,loc);
        buf[bef
+loc]=0;
        bef
+=loc;
        str
+=loc+chrlen;
        len
-=loc+chrlen;
    }

    strcpy(buf
+bef,str);
    len
=strlen(buf)+1;
    str
=new char[len];
    strcpy(str,buf);
    str[len
-1]=0;
    delete [] buf;
}