数据结构串的操作1.头文件://串类的定义class AString{private:char *ch; //串存放数组int curLength; //串的实际长度int maxSize; //存放数组的最大长度.void CheckMem(); //检测内存是否申请成功public:AString();AString(int sz); //构造函数,构造一个最大长度为sz,实际长度为0的字符串AString(const char *init); //构造函数,构造一个最大长度为maxSize,由init 初始化的新字符串对象AString(const AString &ob); //复制构造函数,由一个已有的字符串对象ob 构造一个新字符串~AString(){delete[] ch;} //析构函数,释放动态分配的串空间并撤销该字符串对象//与字符串对象的比较运算int operator == (AString &ob)const {return strcmp(ch,ob.ch) == 0;} //判断当前实例是否与ob串相等,若相等则返回1,否则返回0int operator != (AString &ob)const {return strcmp(ch,ob.ch) != 0;} //判断当前实例是否与ob串不等,若不等则返回1,否则返回0int operator < (AString &ob)const {return strcmp(ch,ob.ch)<0;} //判断当前实例串是否小于ob串,若小于则返回1,否则为0int operator > (AString &ob)const {return strcmp(ch,ob.ch)>0;}//判断当前实例串是否大于ob串,若小于则返回1,否则为0int operator <= (AString &ob)const {return strcmp(ch,ob.ch)<=0;}//判断当前实例串是否小于等于ob串,若小于等于则返回1,否则为0int operator >= (AString &ob)const {return strcmp(ch,ob.ch)>=0;}//判断当前实例串是否大于等于ob串,若大于等于则返回1,否则为0//与字符串的比较运算int operator == (char *str)const{return strcmp(ch,str) == 0;} //判断当前实例是否与C++串相等,若相等则返回1,否则返回0int operator != (char *str)const{return strcmp(ch,str) != 0;}//判断当前实例是否与C++串不相等,若不等则返回1,否则返回0int operator < (char *str)const {return strcmp(ch,str)<0;}//判断当前实例是否与小于C++串,若小于则返回1,否则返回0int operator > (char *str)const{return strcmp(ch,str)>0;}//判断当前实例是否与大于C++串,若小于则返回1,否则返回0int operator <= (char *str)const{return strcmp(ch,str)<=0;}//判断当前实例是否与小于等于C++串,若小于等于则返回1,否则返回0int operator >=(char *str)const {return strcmp(ch,str)>=0;}//判断当前实例是否与大于等于C++串,若大于等于则返回1,否则返回0AString& operator = (AString &ob); //将串ob赋值给当前实例.AString& operator = (const char *str); //将字符串赋值给字符串对象AString& operator +=(AString &ob); //若当前实例串长度与ob串长度之和不超过maxSize则把ob串接在当前实例的后面.AString& operator +=(const char *str); //若当前实例串长度与str串长度之和不超过maxSize,则把str串接到串对象后面.char& operator[](int i); //取当前实例的第i个字符返回.bool IsEmpty()const{return curLength == 0;} //判空函数int Length() const{return curLength;} //返回当前实例的实际字符长度.//下面主要是常用函数的重载等等,方便各种调用方法void SubString(AString &subs,int index,int length); //从索引index开始截取length长度的字符串返回.AString& Remove(int startIndex,int length); //以索引startIndex开始删除length个字符AString& Insert(int pos,const char *value);void Clear(); //清空当前字符串对象void Output(); //输出};//串类的实现void AString::CheckMem(){if(ch == NULL){cerr<<"内存分配失败!\n";exit(1);}}AString::AString(){maxSize = defaultSize;curLength = 0;ch = new char[maxSize];CheckMem();ch[0] = '\0';}AString::AString(int sz){//串构造函数maxSize = sz;ch = new char[maxSize+1];CheckMem();curLength = 0;ch[0] = '\0';}AString::AString(const char *init){//串构造函数int initLength = strlen(init);maxSize = (initLength > defaultSize) ? initLength : defaultSize;ch = new char[maxSize+1];CheckMem();curLength = initLength;strcpy(ch,init);}AString::AString(const AString &ob){//串对象复制构造函数maxSize = ob.maxSize;ch = new char[maxSize+1];CheckMem();strcpy(ch,ob.ch);curLength = ob.curLength;}AString& AString::operator =(AString &ob){if(&ob != this)//若两个串相等为自我赋值{Clear();curLength = ob.curLength;strcpy(ch,ob.ch);}elsecout<<"字符串自身赋值出错!\n";return *this;}AString& AString::operator =(const char *str){//字符串赋值int strLength = strlen(str);maxSize = strLength>maxSize?strLength:maxSize;Clear();strcpy(ch,str);curLength = strLength;return *this;}AString& AString::operator +=(AString &ob){//字符串对象连接char *tempCH = ch;char *tempOb = ob.ch;int addLength = curLength+strlen(tempOb);maxSize = maxSize>addLength?maxSize:addLength;char *temp = new char[maxSize+1];char *tempT = temp;while(*tempCH!='\0')*tempT++=*tempCH++;while(*tempOb!='\0')*tempT++=*tempOb++;*tempT++='\0';Clear();strcpy(ch,temp);curLength=strlen(ch);delete[] temp;return *this;}AString& AString::operator +=(const char *str){//字符串连接到字符串对象char *tempCH = ch;int addLength = curLength+strlen(str);maxSize = maxSize>addLength?maxSize:addLength;char *temp = new char[maxSize+1];char *tempT = temp;while(*tempCH!='\0')*tempT++=*tempCH++;while(*str!='\0')*tempT++=*str++;*tempT++='\0';Clear();strcpy(ch,temp);curLength=strlen(ch);delete[] temp;return *this;}char& AString::operator [](int i){//读取索引位置上的字符if(i<0||i>curLength){cerr<<"字符下标越界\n";exit(1);}return ch[i];}void AString::SubString(AString &subs,int index,int length) {if(index<0||index+length>maxSize||length<0){cerr<<"或索引或者长度越界\n";exit(1);}if(IsEmpty())cerr<<"字符串对象为空\n",exit(1);else{char *temp = new char[length+1];if(temp==NULL){cerr<<"内存分配错误!\n";exit(1);}for(int i=0,j=index;i<length;i++,j++){temp[i] = ch[j];}temp[length] = '\0';subs=temp;}}AString& AString::Remove(int startIndex,int length){if(startIndex<0||startIndex+length>maxSize||length<0){cerr<<"索引或长度越界\n";exit(1);}if(IsEmpty())cerr<<"字符串对象为空\n",exit(1);for(int i=0;i<curLength-startIndex-length;i++){ch[i+startIndex] = ch[i+length+startIndex];}ch[curLength-length] = '\0';curLength=strlen(ch);return *this;}AString& AString::Insert(int pos,const char *value){if(pos>curLength||pos<0){cerr<<"试图插入的位置越界\n";exit(1);}int addLength = strlen(value) + curLength;maxSize = addLength>maxSize?addLength:maxSize;char *temp = new char[maxSize+1];char *tempCH = ch;char *tempH = temp;for(int i=0;i<pos;i++)*temp++ = *tempCH++;//先将当前对象中插入位置之前的字符复制到tempH指向的内存中while(*value!='\0')*temp++=*value++;//再将待插入的字符串连接到tempH指向的内存中while(*tempCH!='\0')*temp++=*tempCH++;//最后将当前对象插入位置之后的字符连接到tempH指向的内存中*temp='\0';Clear(); //清空当前对象strcpy(ch,tempH);//将拼接好的字符串复制到实例中curLength=strlen(ch);return *this;}void AString::Clear(){delete[] ch;ch = new char[maxSize+1];CheckMem();//释放内存并重新申请ch[0] = '\0';//将串对象置为空curLength = 0;}void AString::Output(){if(IsEmpty())cerr<<"字符串对象为空"<<endl;elsecout<<ch<<endl;}2.主程序:#include<iostream.h>#include"stdio.h"//EOF,NULL#include<string>const int defaultSize = 128;using namespace std;#include"AString.h"int main(){cout<<"------------------------------------------------------------------------"<<endl;cout<<"请输入初始化对象的大小:";int len;cin>>len;char *str = new char[len+1];cout<<"\n请输入要初始化字符串(不能含有空格):";cin>>str;AString string(len);string = str;int tag=0;while(1){cout<<"1-删除操作\n"<<"2-插入操作\n"<<"3-连接操作\n"<<"4-截取字符串\n"<<"5-字符比较\n"<<"6-输出字符串对象\n"<<"7-清空字符对象(清空后可选择序号8来重新赋值)\n"<<"8-字符串对象赋值\n"<<"9-退出程序\n";cout<<"\n请输入要操作的方法的序号:";cin>>tag;switch(tag){case 1:{int index,length;cout<<"请输入要删除的起始位置:";cin>>index;cout<<"\n请输入要删除的长度:";cin>>length;string.Remove(index,length);cout<<"\n删除后的字符串:"<<endl;string.Output();break;}case 2:{int index;char *input = new char[defaultSize];cout<<"\n请输入要插入的字符串:";cin>>input;//cout<<" 输入的串长为:"<<strlen(input)<<endl;cout<<"\n请输入要插入的位置:";cin>>index;string.Insert(index,input);cout<<"\n插入字符串后的字符对象:"<<endl;string.Output();delete[] input;break;}case 3:{char *value = new char[defaultSize+1];cout<<"\n请输入要连接的字符串:";cin>>value;AString astr = value;string+=astr;cout<<"\n连接字符串后的字符对象:"<<endl;string.Output();delete[] value;break;}case 4:{int len,i;AString subs;cout<<"\n请输入要截取的字符串长度:";cin>>len;cout<<"\n请输入开始截取的位置:";cin>>i;string.SubString(subs,i,len);cout<<"\n下面为截取后的字符串对象:";subs.Output();break;}case 5:{char *value = new char[128];cout<<"\n请输入要比较的字符串:";cin>>value;cout<<"\n字符串比较结果如下所示:";string.Output();if(string>value) cout<<">";if(string==value) cout<<"=";if(string<value) cout<<"<";cout<<value<<endl;break;}case 6:cout<<"\n当前字符串对象的值如下所示:";string.Output();break;case 7:string.Clear();cout<<"\n字符串对象已清空!\n";break;case 8:{char *str = new char[128];cout<<"\n请输入要赋值的字符串(不能有空格):";cin>>str;string = str;cout<<"\n赋值后的字符串对象为:";string.Output();break;}case 9:cout<<"运行结束"<<endl;return 0;break;default:cout<<"选择非法,请重选!";break;}}}。