数据结构之 字符串


#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;
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值