string.h
/* string DIY process must be the most important in our job */
/* string is a sequent list limited */
/* string.h
--int strcpy(s1,s2) copy s2 content to s1 **if s1 bigger than s2,the front content will be reaplaced,with remain the last content
--int strcat(s1,s2) put s2 to s1's rear part
--int strlen(s) count the size of string
--char* _strdup(s) char *p=_strdup(s); generate string by an another string
--int strcmp(s1,s2)
*/
字符串ADT
/* string DIY process must be the most important in our job */
/* string is a sequent list limited */
/* string.h
--int strcpy(s1,s2) copy s2 content to s1 **if s1 bigger than s2,the front content will be reaplaced,with remain the last content
--int strcat(s1,s2) put s2 to s1's rear part
--int strlen(s) count the size of string
--char* _strdup(s) char *p=_strdup(s); generate string by an another string
--int strcmp(s1,s2)
*/
#define MAX 1000
typedef char OrderString[MAX];
class MyString{
protected:
char *ch;
int length;
int maxSize;
public:
MyString(int size=MAX);
MyString(const char *init);//strlen strcpy
MyString(const MyString& ms);//strlen strcpy
~MyString(){delete []ch;}
int Length()const{return length;}
MyString& operator()(int pos,int len);
int operator==(MyString& ms)const{return strcmp(ch,ms.ch)==0;}
int operator!=(MyString& ms)const{return strcmp(ch,ms.ch)!=0;}
int operator!()const(return length==0;}
MyString& operator=(const MyString& ms);
MyString& operator+=(const MyString& ms);//strcat
char& operator[](int i);
int KMPFind(MyString &pat)const;
void getNext(int next[]);
};
MyString::MyString(int size):maxSize(size){
ch=new char[maxSize+];
assert(ch!=NULL);
length=0;ch[0]='\0';
}
MyString(const char *init){
int len=strlen(init);
maxSize=(len>MAX)?len:MAX;
ch=new char[maxSize+1];
assert(ch!=NULL);
length=len;
strcpy(ch,init);
}
MyString MyString::(const MyString &ms){
maxSize=ms.maxSize;
ch=new char[ms.length+1];
assert(ch!=NULL);
length=ms.length;
strcpy(ch,ms.ch);
}
MyString MyString::operator()(int pos,int len){
MyString temp;
if(pos<0 || pos+len>=maxSize+1 || len<0){
temp.length=0;temp.ch[0]='\0';
}else{
//len in sense
if(pos+len>=length+1)
len=length-pos;
//get substr
temp.len=len;
for(int i=0,j=pos;i<len;i++,j++)
temp.ch[i]=ch[j];
temp.ch[len]='\0';
}
return temp;
}
MyString& MyString::operator=(const MyString& ms){
if(this==&ms){
return ms;
}
delete []ch;
ch=new char[ms.maxSize+1];
assert(ch!=NULL);
length=ms.length;
strcpy(ch,ms.ch);
return *this;
}
MyString& MyString::operator+=(const MyString& ms){
//strcat
//bigger than maxSize
char *temp=ch;
int n=length+ms.length;
int m=(n>=maxSize)?maxSize:n;
ch=new char[m];
assert(ch!=NULL);
//catch
maxSize=m;
length=n;
strcpy(ch,temp);
strcat(ch,ms.ch);
delete []temp;
return *this;
}
char& MyString::operator[](int i){
assert(!(i<0||i>=length));
return ch[i];
}
int MyString::KMPFind(MyString &pat,int k,int next[])const{
int posT=k;
int posP=0;
int lenP=pat.length;
int lenT=length;
while(posT<lenT&&posP<lenP){
if(posP==-1||pat.ch[posP]==ch[posT]){
posT++;posP++;//B-F part
}
else{
posP=next[posP];//K-M-P part
}
}
if(posT>=lenT || posP<lenP)
//matching failed
return -1;
else
//return first index in Tstring
return posT-lenP;
}
void MyString::getNext(int next[]){
int j=0;
int k=-1;
int lenP=length;
next[0]=-1;
while(j<lenP){
if(k==-1||ch[j]==ch[k]){
j++;k++;
next[j]=k;
}else{
k=next[k];
}
}
}