串的相关操作(C++描述)

来源:互联网 发布:淘宝网店运营分析报告 编辑:程序博客网 时间:2024/05/14 10:48

复习一下串的一些相关操作.

文件"mystring.h"

#include<iostream>using namespace std;class My_string{private:char *ch;int length;public:My_string(){ch=NULL;length=0;}char *C_str(){return ch;}void Assign(char chars[]) //初始化串{//把字符串常量chars[]赋值给串int i=0,j=0,chars_len=0;while(chars[i]!='\0'){chars_len+=1;i++;}if(!chars_len){ch=NULL;length=0;}else{i=0;ch=new char[chars_len+1];while(chars[i]!='\0')ch[j++]=chars[i++];ch[j]='\0';length=chars_len;}}int Get_length(){return length;}int Str_cmp(My_string S)//比较两个字符串{//比较两个字符串的每个字符对应的ASCII码值int i=0;while(this->ch[i]==S.ch[i])i++;return (this->ch[i]-S.ch[i]);}void Clear_Str(){if(this->ch){this->ch=NULL;length=0;}}void Concat_Str(My_string &T,My_string s) //连接字符串{//用T存储对象和串S连接后的串int s1_len=this->length;int s2_len=s.Get_length();T.ch=new char[s1_len+s2_len+1];int i=0,k=0;while(this->ch[i]!='\0')T.ch[k++]=this->ch[i++];i=0;while(s.ch[i]!='\0')T.ch[k++]=s.ch[i++];T.ch[k]='\0';T.length=s1_len+s2_len;}void Sub_Str(My_string &sub,int pos,int len) //求子串{//用sub存储从pos开始的长度为len的对象的子串//其中1<=pos<length,0<=len<=lengthint s_len=this->length;if(pos<1 || pos>s_len+1 || len<0 || len>length){cout<<"参数不合法"<<endl;return;}if(!len){sub.ch=NULL;sub.length=0;}else{sub.ch=new char[len+1];for(int i=0;i<len;i++)sub.ch[i]=this->ch[i+pos-1];sub.ch[len]='\0';sub.length=len;}}void Insert_Str(int pos,My_string T) //插入{//在第pos个字符之前插入串Tint s_len=length;int t_len=T.Get_length();cout<<"插入的串的长度:"<<t_len<<endl;cout<<"插入前主串的长度:"<<s_len<<endl;if(pos<1 || pos>s_len+1){cout<<"插入位置不合法"<<endl;return;}char *a=new char[255];if(t_len){int i=0,k=0;while(ch[i]!='\0'){a[i]=ch[i];i++;}a[i]='\0';delete ch;ch=new char[s_len+t_len+1];for(i=0,k=0;i<pos-1;i++)ch[k++]=a[i];int j=0;while(T.ch[j]!='\0'){ch[k]=T.ch[j];k++;j++;}while(a[i]!='\0'){ch[k]=a[i];i++;k++;}ch[k]='\0';length=s_len+t_len;delete a;}}int Index_BF(My_string S,int pos=1) //BF算法模式匹配{//从pos位置开始进行进行模式匹配//1<=pos<=length-S.length+1if(pos<0 || pos>length-S.Get_length()+1){cout<<"pos参数不合理"<<endl;return -1;}int i=pos-1;int j=0;while(ch[i+j]!='\0' && S.ch[j]!='\0'){if(ch[i+j]==S.ch[j])j++;else{i++;j=0;}}if(S.ch[j]=='\0')return i+1;elsereturn -1;}void Get_next(int next[]){//求模式的next函数值并存入数组next中,为后面的模式匹配做准备int k=-1,j=0;next[0]=-1;while(j<length){if( (k==-1)||(ch[j]==ch[k]) ){++j;++k;next[j]=k;}elsek=next[k];}}int Index_KMP(My_string S,int next[],int pos=1) //KMP模式匹配{//在主串中匹配S//其中要满足1<=pos<=length-S.getlength()+1  if(pos<0 || pos>length-S.Get_length()+1){cout<<"pos参数不合理"<<endl;return -1;}int i=pos-1;int j=0;int n=length;int m=S.Get_length();while(i<n && j<m){if(j==-1 || ch[i]==S.ch[j]) //j=-1时,是在T的第一个元素就和S[i]不相等时{i++;j++;}elsej=next[j];}if(j>=m)return i-m+1; //匹配成功elsereturn -1;}void Del_Str(int pos,int len) //删除{//从pos位置开始删除长度为len的串int i=pos-1;int j=pos+len-1;for(;j<length;i++,j++)ch[i]=ch[j];ch[i]='\0';length-=len;}bool Peplace_Str(My_string old_str,My_string new_str) //替换{//用new_str替换主串中的old_strint pos=Index_BF(old_str); //先查出old_str在主串中的初始位置if(-1==pos){cout<<"主串中不存在子串 "<<old_str.ch<<endl;return false;}Del_Str(pos,old_str.Get_length());Insert_Str(pos,new_str);return true;}};

主函数"main.cpp"

#include"mystring.h"int main(){cout<<"输入字符串T:";char a[255];cin>>a;cout<<endl;cout<<"输入字符串S:";char b[255];cin>>b;cout<<endl;My_string T,S;T.Assign(a);S.Assign(b);if(T.Str_cmp(S)>0)cout<<"字符串T>S"<<endl;else if(T.Str_cmp(S)<0)cout<<"字符串T<S"<<endl;elsecout<<"字符串T=S"<<endl;My_string sub;T.Sub_Str(sub,3,4);cout<<"T.Sub(sub,3,4)为:"<<sub.C_str()<<endl;T.Concat_Str(sub,S);cout<<"字符串T和S连接后为:"<<sub.C_str()<<endl;cout<<"现在新串的长度为:"<<sub.Get_length()<<endl;cout<<"输入要插入T中的字符串:";char c[20];cin>>c;cout<<endl;cout<<"输入要插入的位置:";int pos;cin>>pos;sub.Assign(c);T.Insert_Str(pos,sub);cout<<"现在串T的长度为:"<<T.Get_length()<<endl;cout<<"插入后字符串T为:"<<T.C_str()<<endl;cout<<"输入要进行模式匹配的子串:";cin>>c;sub.Assign(c);int next[100];memset(next,0,sizeof(next));sub.Get_next(next);//pos=T.Index_BF(sub);pos=T.Index_KMP(sub,next);if(pos!=-1){cout<<"在主串 "<<T.C_str()<<" 中子串 "<<sub.C_str()<<" 开始的位置为"<<pos<<endl;}cout<<"输入你要在主串中删除的子串的起始位置和长度:";int len;cin>>pos>>len;T.Del_Str(pos,len);cout<<"删除后的主串为:"<<T.C_str()<<endl;cout<<"输入要在主串中替换掉的子串:";cin>>a;My_string old_str;old_str.Assign(a);cout<<"输入新子串:";cin>>b;My_string new_str;new_str.Assign(b);if(T.Peplace_Str(old_str,new_str))cout<<"替换后的主串为:"<<T.C_str()<<endl;cout<<"清空字符串S"<<endl;S.Clear_Str();int i=S.Get_length();if(!i)cout<<"串S为空"<<endl;return 0;}

测试结果:

 

输入字符串T:wangjiakai输入字符串S:liu字符串T>ST.Sub(sub,3,4)为:ngji字符串T和S连接后为:wangjiakailiu现在新串的长度为:13输入要插入T中的字符串:ailiudan输入要插入的位置:11插入的串的长度:8插入前主串的长度:10现在串T的长度为:18插入后字符串T为:wangjiakaiailiudan输入要进行模式匹配的子串:aiai在主串 wangjiakaiailiudan 中子串 aiai 开始的位置为9输入你要在主串中删除的子串的起始位置和长度:11 2删除后的主串为:wangjiakailiudan输入要在主串中替换掉的子串:kai输入新子串:kaiLove插入的串的长度:7插入前主串的长度:13替换后的主串为:wangjiakaiLoveliudan清空字符串S串S为空Press any key to continue


原创粉丝点击