串的基本操作
#include <iostream>
#include <algorithm>
#include <cstring>
#define sqtrmax 1000
using namespace std;
typedef struct
{
? ? char *data;
? ? int length;
} sqtr;
void StrAssign (sqtr &S, char *chars); ? ? ? ? ? ? ? //賦值
void Destroy(sqtr &S); ? ? ? ? ? ? ? ? ? ? ? ? //銷(xiāo)毀
void StrCopy (sqtr &T,sqtr S); ? ? ? ? ? ? ? ? ?//復(fù)制
int StrLength(sqtr S); ? ? ? ? ? ? ? ? ? ? ? ? ? ?//長(zhǎng)度
int StrEmpty (sqtr S); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //判空
void Concat (sqtr &T,sqtr S1,sqtr S2); ? ? ? ? ? ? //串聯(lián)接
int StrCompare (sqtr S, sqtr T); ? ? ? ? ? ? ? ? ?//比較
int SubString (sqtr &Sub,sqtr S,int pos,int len); ? //求子串
void ClearString (sqtr &S); ? ? ? ? ? ? ? ? ? ? ? ?//清空
int Index (sqtr S,sqtr T,int pos); ? ? ? ? ? ? ? ?//定位函數(shù)
void Replace (sqtr &S, sqtr T,sqtr V); ? ? ? ? ? ? ? ? ?//串置換
int StrInsert (sqtr &S,int pos, sqtr T); ? ? ? ? ? ? ?//插入
int StrDele (sqtr &S,int pos,int len); ? ? ? ? ? ? ? //刪除
void StrOutput(sqtr S) ; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//輸出
int main()
{
? ? char str[12]="abcssasdsss",str1[4]="sss",str2[4]="vvv";
? ? sqtr S,T,V,S1,Sub;
? ? S.data=NULL;
? ? T.data=NULL,V.data=NULL;
? ? StrAssign(S,str);
? ? StrAssign(T,str1);
? ? StrAssign(V,str2);
? ? cout<<"串S:";
? ? StrOutput(S);
? ? cout<<endl;
? ? cout<<"串T:";
? ? StrOutput(T);
? ? cout<<endl;
? ? cout<<"串V:";
? ? StrOutput(V);
? ? cout<<endl;
? ? cout<<"求第3個(gè)后S中與T相等的子串的位置";
? ? cout<<Index(S,T,3);
? ? cout<<endl;
? ? cout<<"求第3個(gè)后S中長(zhǎng)度為3的子串";
? ? SubString(Sub,S,3,3);
? ? StrOutput(Sub);
? ? cout<<endl;
? ? cout<<"在串S的第10個(gè)字符之前插入串T:";
? ? StrInsert(S,10,T);
? ? StrOutput(S);
? ? cout<<endl;
? ? cout<<"刪除串S從第2個(gè)字符起長(zhǎng)度為3的子串:";
? ? StrDele(S,2,3);
? ? StrOutput(S);
? ? cout<<endl;
? ? cout<<"連接T,V到S1";
? ? Concat(S1,T,V);
? ? StrOutput(S1);
? ? cout<<endl;
? ? //cout<<"\n"<<"采用KMP算法進(jìn)行模式匹配:";
? ? //cout<<Index_KMP(S,T,1)<<endl;
? ? cout<<"用串V替換S中與T相等的所有子串:";
? ? Replace(S,T,V);
? ? StrOutput(S);
? ? cout<<endl;
}
/**賦值**//*strcpy(S.data,chars);*/
void StrAssign (sqtr &S, char *chars)
{
? ? int i;
? ? S.data=(char *)malloc(sqtrmax *sizeof(char));
? ? if(!S.data) exit(0);
? ? for(i=0; chars[i]!='\0'; i++)
? ? ? ? S.data[i]=chars[i];
? ? ? ? S.data[i]='\0';
? ? S.length=i;
}
/**長(zhǎng)度**//*strlen(S.data);*/
int StrLength(sqtr S)
{
? ? return S.length;
}
/**判空**/
int StrEmpty (sqtr S)
{
? ? if(!S.length) ?//長(zhǎng)度=0
? ? ? ? return 1;
? ? else
? ? ? ? return 0;
}
/**復(fù)制**//*strcpy(S.data,chars);*/
void StrCopy (sqtr &T,sqtr S)
{
? ? StrAssign(T,S.data);//不是S
}
/**清空**/
void ClearString (sqtr &S)
{
? ? if(S.data)
? ? {
? ? ? ? delete S.data;
? ? ? ? S.data=NULL;
? ? }
? ? S.length=0;
}
/**銷(xiāo)毀 似清空**/
void Destroy(sqtr &S)
{
? ? if(S.data)
? ? {
? ? ? ? delete S.data;
? ? ? ? S.data=NULL;
? ? }
}
/**比較**//*(strcmp(S.data,T.data)==0)*/
int StrCompare (sqtr S, sqtr T)
{
? ? int i;
? ? for(i=0; i<S.length&&i<T.length; i++)
? ? ? ? if(S.data[i]!=T.data[i])
? ? ? ? ? ? return S.data[i]-T.data[i];//S的值大就>0
? ? return S.length-T.length;
? ? //注意return有終止作用,誰(shuí)先執(zhí)行就return誰(shuí);
}
/**刪除**/
int StrDele (sqtr &S,int pos,int len)
{
? ? if(pos<1||pos>S.length-len+1)
? ? ? ? return 0;
? ? int i=0;
? ? while(i<pos-1)
? ? ? ? i++;
? ? for(i=pos-1; i<S.length-len; i++)
? ? ? ? S.data[i]=S.data[i+len];
? ? S.data[i]='\0';
? ? S.length-=len;
}
/**串聯(lián)接**/
void Concat (sqtr &T,sqtr S1,sqtr S2)
{
? ? T.length=S1.length+S2.length+1;
? ? T.data=(char *)malloc(S1.length+S2.length *sizeof(char));
? ? int j=0,k=0;
? ? while(S1.data[j]!='\0') T.data[k++]=S1.data[j++];
? ? j=0;
? ? while(S2.data[j]!='\0') T.data[k++]=S2.data[j++];
? ? T.data[k]='\0';
}
/**求子串**/
int SubString (sqtr &Sub,sqtr S,int pos,int len)
{
? ? // 以 Sub 返回串 S 中第 pos 個(gè)字符起長(zhǎng)度為 len 的子串
? ? Sub.data=(char *)malloc(len *sizeof(char));
? ? Sub.length=len;
? ? int i,k;
? ? if(pos<1)
? ? ? ? return 0;
? ? i=0;
? ? while(i<pos-1&&S.data[i]!='\0') i++;
? ? if(i<pos-1||S.data[i]=='\0')
? ? ? ? return 0;
? ? else
? ? {
? ? ? ? k=0;
? ? ? ? while(len--&&S.data[i]!='\0')
? ? ? ? {
? ? ? ? ? ? Sub.data[k++]=S.data[i++];
? ? ? ? ? ? //cout<<Sub.data[k-1]<<endl;
? ? ? ? }
? ? ? ? if(k<S.length) return 0;
? ? ? ? else
? ? ? ? ? ? Sub.data[k]='\0';
? ? }
}
/**定位函數(shù)**/
int Index (sqtr S,sqtr T,int pos)
{
? ? //若主串 S 中存在和串 T 值相同的子串,則返回它在主串 S 中第 pos個(gè)字符之后第一次出現(xiàn)的位置; 否則函數(shù)值為0。
? ? int i,j;
? ? if(pos>0)
? ? {
? ? ? ? i=pos-1;
? ? ? ? j=0;
? ? ? ? while(S.data[i+j]!='\0'&&T.data[j]!='\0')
? ? ? ? {
? ? ? ? ? ? if(S.data[i+j]==T.data[j])
? ? ? ? ? ? {
? ? ? ? ? ? ? ? j++;
? ? ? ? ? ? }
? ? ? ? ? ? else
? ? ? ? ? ? {
? ? ? ? ? ? ? ? i++;//相當(dāng)于二重for循環(huán)中跳出j,進(jìn)入i循環(huán)
? ? ? ? ? ? ? ? j=0;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? if(T.data[j]=='\0')
? ? ? ? ? ? ? ? return i+1;
? ? ? ? ? ? else
? ? ? ? ? ? return 0;
? ? }
}
/**串置換**///用 V 替換主串 S 中出現(xiàn)的所有與模式串)T 相等的不重疊的子串。
void Replace (sqtr &S,sqtr T,sqtr V)
{
? ? sqtr news,sub;
? ? news.data=(char *)malloc(sqtrmax *sizeof(char));
? ? news.data=NULL;
? ? int n=S.length,m=T.length;
? ? int i=1,pos=1,j=0;
? ? while(pos<=n-m+1&&i)//n-m+1
? ? {
? ? ? ? i=Index(S,T,pos);
? ? ? ? if(i!=0)//不能寫(xiě)i,因?yàn)閕是位置,不一定啥數(shù)
? ? ? ? {
? ? ? ? ? ? SubString(sub,S,pos,i-pos);
? ? ? ? ? ? if(j==0)
? ? ? ? ? ? {
? ? ? ? ? ? Concat(news,sub,V);
? ? ? ? ? ? }
? ? ? ? ? ? else
? ? ? ? ? ? {
? ? ? ? ? ? ? ? if(i-pos!=0)
? ? ? ? ? ? ? ? Concat(news,news,sub);
? ? ? ? ? ? ? ? Concat(news,news,V);//當(dāng)非第一次時(shí),后面要直接連在news上
? ? ? ? ? ? }
? ? ? ? ? ? pos=i+m;
? ? ? ? ? ? j++;
? ? ? ? }
? ? }
? ? SubString(sub,S,pos,n-pos+1);
? ? if(n-pos+1!=0)
? ? Concat(S,news,sub);
? ? StrAssign(S,news.data);
}
/**插入**/
int StrInsert (sqtr &S,int pos,sqtr T)
{
? ? int sl=S.length,tl=T.length;// 在串 S 的第 pos(1≤pos≤StrLength(S)+1) 個(gè)字符之前插入串T
? ? char S1[sl+1] ; ? ? ? ? ? ?// 設(shè)S1為輔助串空間
? ? if (pos < 1 || pos > sl+1)
? ? ? ? return 0; ? ? ? ? ? ? ? // 插入位置不合法;
? ? if (tl>0)
? ? {
? ? ? ? int i=0,k,j;
? ? ? ? while ( S.data[i]!='\0')
? ? ? ? {
? ? ? ? ? ? S1[i]=S.data[i];
? ? ? ? ? ? i++;// 暫存串S
? ? ? ? }
? ? ? ? S1[i]='\0';
? ? ? ? S.data= (char *)malloc((sl + tl +1) *sizeof(char)); ? // 重新分配空間
? ? ? ? for ( i=0, k=0; i<pos-1; i++)
? ? ? ? {
? ? ? ? ? ? S.data[k++] = S1[i];
? ? ? ? ? ? // 保留插入位置之前的子串
? ? ? ? }
? ? ? ? j = 0;
? ? ? ? while ( T.data[j]!= '\0')
? ? ? ? {
? ? ? ? ? ? S.data[k++] = T.data[j++];
? ? ? ? } ? ? // 插入T
? ? ? ? while ( S1[i] != '\0')
? ? ? ? ? ? S.data[k++] = S1[i++]; ?// 復(fù)制插入位置之后的子串
? ? ? ? S.data[k] = '\0';
? ? ? ? S.length=k; ? ? ? ? ? ? ? ? ? ? ?// 置串S的結(jié)束標(biāo)志
? ? }
}
/**輸出**/
void StrOutput(sqtr S)
{
? ? int i=0;
? ? while(i<S.length)
? ? {
? ? ? ? cout<<S.data[i];
? ? ? ? i++;
? ? }
}V
#include <algorithm>
#include <cstring>
#define sqtrmax 1000
using namespace std;
typedef struct
{
? ? char *data;
? ? int length;
} sqtr;
void StrAssign (sqtr &S, char *chars); ? ? ? ? ? ? ? //賦值
void Destroy(sqtr &S); ? ? ? ? ? ? ? ? ? ? ? ? //銷(xiāo)毀
void StrCopy (sqtr &T,sqtr S); ? ? ? ? ? ? ? ? ?//復(fù)制
int StrLength(sqtr S); ? ? ? ? ? ? ? ? ? ? ? ? ? ?//長(zhǎng)度
int StrEmpty (sqtr S); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //判空
void Concat (sqtr &T,sqtr S1,sqtr S2); ? ? ? ? ? ? //串聯(lián)接
int StrCompare (sqtr S, sqtr T); ? ? ? ? ? ? ? ? ?//比較
int SubString (sqtr &Sub,sqtr S,int pos,int len); ? //求子串
void ClearString (sqtr &S); ? ? ? ? ? ? ? ? ? ? ? ?//清空
int Index (sqtr S,sqtr T,int pos); ? ? ? ? ? ? ? ?//定位函數(shù)
void Replace (sqtr &S, sqtr T,sqtr V); ? ? ? ? ? ? ? ? ?//串置換
int StrInsert (sqtr &S,int pos, sqtr T); ? ? ? ? ? ? ?//插入
int StrDele (sqtr &S,int pos,int len); ? ? ? ? ? ? ? //刪除
void StrOutput(sqtr S) ; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//輸出
int main()
{
? ? char str[12]="abcssasdsss",str1[4]="sss",str2[4]="vvv";
? ? sqtr S,T,V,S1,Sub;
? ? S.data=NULL;
? ? T.data=NULL,V.data=NULL;
? ? StrAssign(S,str);
? ? StrAssign(T,str1);
? ? StrAssign(V,str2);
? ? cout<<"串S:";
? ? StrOutput(S);
? ? cout<<endl;
? ? cout<<"串T:";
? ? StrOutput(T);
? ? cout<<endl;
? ? cout<<"串V:";
? ? StrOutput(V);
? ? cout<<endl;
? ? cout<<"求第3個(gè)后S中與T相等的子串的位置";
? ? cout<<Index(S,T,3);
? ? cout<<endl;
? ? cout<<"求第3個(gè)后S中長(zhǎng)度為3的子串";
? ? SubString(Sub,S,3,3);
? ? StrOutput(Sub);
? ? cout<<endl;
? ? cout<<"在串S的第10個(gè)字符之前插入串T:";
? ? StrInsert(S,10,T);
? ? StrOutput(S);
? ? cout<<endl;
? ? cout<<"刪除串S從第2個(gè)字符起長(zhǎng)度為3的子串:";
? ? StrDele(S,2,3);
? ? StrOutput(S);
? ? cout<<endl;
? ? cout<<"連接T,V到S1";
? ? Concat(S1,T,V);
? ? StrOutput(S1);
? ? cout<<endl;
? ? //cout<<"\n"<<"采用KMP算法進(jìn)行模式匹配:";
? ? //cout<<Index_KMP(S,T,1)<<endl;
? ? cout<<"用串V替換S中與T相等的所有子串:";
? ? Replace(S,T,V);
? ? StrOutput(S);
? ? cout<<endl;
}
/**賦值**//*strcpy(S.data,chars);*/
void StrAssign (sqtr &S, char *chars)
{
? ? int i;
? ? S.data=(char *)malloc(sqtrmax *sizeof(char));
? ? if(!S.data) exit(0);
? ? for(i=0; chars[i]!='\0'; i++)
? ? ? ? S.data[i]=chars[i];
? ? ? ? S.data[i]='\0';
? ? S.length=i;
}
/**長(zhǎng)度**//*strlen(S.data);*/
int StrLength(sqtr S)
{
? ? return S.length;
}
/**判空**/
int StrEmpty (sqtr S)
{
? ? if(!S.length) ?//長(zhǎng)度=0
? ? ? ? return 1;
? ? else
? ? ? ? return 0;
}
/**復(fù)制**//*strcpy(S.data,chars);*/
void StrCopy (sqtr &T,sqtr S)
{
? ? StrAssign(T,S.data);//不是S
}
/**清空**/
void ClearString (sqtr &S)
{
? ? if(S.data)
? ? {
? ? ? ? delete S.data;
? ? ? ? S.data=NULL;
? ? }
? ? S.length=0;
}
/**銷(xiāo)毀 似清空**/
void Destroy(sqtr &S)
{
? ? if(S.data)
? ? {
? ? ? ? delete S.data;
? ? ? ? S.data=NULL;
? ? }
}
/**比較**//*(strcmp(S.data,T.data)==0)*/
int StrCompare (sqtr S, sqtr T)
{
? ? int i;
? ? for(i=0; i<S.length&&i<T.length; i++)
? ? ? ? if(S.data[i]!=T.data[i])
? ? ? ? ? ? return S.data[i]-T.data[i];//S的值大就>0
? ? return S.length-T.length;
? ? //注意return有終止作用,誰(shuí)先執(zhí)行就return誰(shuí);
}
/**刪除**/
int StrDele (sqtr &S,int pos,int len)
{
? ? if(pos<1||pos>S.length-len+1)
? ? ? ? return 0;
? ? int i=0;
? ? while(i<pos-1)
? ? ? ? i++;
? ? for(i=pos-1; i<S.length-len; i++)
? ? ? ? S.data[i]=S.data[i+len];
? ? S.data[i]='\0';
? ? S.length-=len;
}
/**串聯(lián)接**/
void Concat (sqtr &T,sqtr S1,sqtr S2)
{
? ? T.length=S1.length+S2.length+1;
? ? T.data=(char *)malloc(S1.length+S2.length *sizeof(char));
? ? int j=0,k=0;
? ? while(S1.data[j]!='\0') T.data[k++]=S1.data[j++];
? ? j=0;
? ? while(S2.data[j]!='\0') T.data[k++]=S2.data[j++];
? ? T.data[k]='\0';
}
/**求子串**/
int SubString (sqtr &Sub,sqtr S,int pos,int len)
{
? ? // 以 Sub 返回串 S 中第 pos 個(gè)字符起長(zhǎng)度為 len 的子串
? ? Sub.data=(char *)malloc(len *sizeof(char));
? ? Sub.length=len;
? ? int i,k;
? ? if(pos<1)
? ? ? ? return 0;
? ? i=0;
? ? while(i<pos-1&&S.data[i]!='\0') i++;
? ? if(i<pos-1||S.data[i]=='\0')
? ? ? ? return 0;
? ? else
? ? {
? ? ? ? k=0;
? ? ? ? while(len--&&S.data[i]!='\0')
? ? ? ? {
? ? ? ? ? ? Sub.data[k++]=S.data[i++];
? ? ? ? ? ? //cout<<Sub.data[k-1]<<endl;
? ? ? ? }
? ? ? ? if(k<S.length) return 0;
? ? ? ? else
? ? ? ? ? ? Sub.data[k]='\0';
? ? }
}
/**定位函數(shù)**/
int Index (sqtr S,sqtr T,int pos)
{
? ? //若主串 S 中存在和串 T 值相同的子串,則返回它在主串 S 中第 pos個(gè)字符之后第一次出現(xiàn)的位置; 否則函數(shù)值為0。
? ? int i,j;
? ? if(pos>0)
? ? {
? ? ? ? i=pos-1;
? ? ? ? j=0;
? ? ? ? while(S.data[i+j]!='\0'&&T.data[j]!='\0')
? ? ? ? {
? ? ? ? ? ? if(S.data[i+j]==T.data[j])
? ? ? ? ? ? {
? ? ? ? ? ? ? ? j++;
? ? ? ? ? ? }
? ? ? ? ? ? else
? ? ? ? ? ? {
? ? ? ? ? ? ? ? i++;//相當(dāng)于二重for循環(huán)中跳出j,進(jìn)入i循環(huán)
? ? ? ? ? ? ? ? j=0;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? if(T.data[j]=='\0')
? ? ? ? ? ? ? ? return i+1;
? ? ? ? ? ? else
? ? ? ? ? ? return 0;
? ? }
}
/**串置換**///用 V 替換主串 S 中出現(xiàn)的所有與模式串)T 相等的不重疊的子串。
void Replace (sqtr &S,sqtr T,sqtr V)
{
? ? sqtr news,sub;
? ? news.data=(char *)malloc(sqtrmax *sizeof(char));
? ? news.data=NULL;
? ? int n=S.length,m=T.length;
? ? int i=1,pos=1,j=0;
? ? while(pos<=n-m+1&&i)//n-m+1
? ? {
? ? ? ? i=Index(S,T,pos);
? ? ? ? if(i!=0)//不能寫(xiě)i,因?yàn)閕是位置,不一定啥數(shù)
? ? ? ? {
? ? ? ? ? ? SubString(sub,S,pos,i-pos);
? ? ? ? ? ? if(j==0)
? ? ? ? ? ? {
? ? ? ? ? ? Concat(news,sub,V);
? ? ? ? ? ? }
? ? ? ? ? ? else
? ? ? ? ? ? {
? ? ? ? ? ? ? ? if(i-pos!=0)
? ? ? ? ? ? ? ? Concat(news,news,sub);
? ? ? ? ? ? ? ? Concat(news,news,V);//當(dāng)非第一次時(shí),后面要直接連在news上
? ? ? ? ? ? }
? ? ? ? ? ? pos=i+m;
? ? ? ? ? ? j++;
? ? ? ? }
? ? }
? ? SubString(sub,S,pos,n-pos+1);
? ? if(n-pos+1!=0)
? ? Concat(S,news,sub);
? ? StrAssign(S,news.data);
}
/**插入**/
int StrInsert (sqtr &S,int pos,sqtr T)
{
? ? int sl=S.length,tl=T.length;// 在串 S 的第 pos(1≤pos≤StrLength(S)+1) 個(gè)字符之前插入串T
? ? char S1[sl+1] ; ? ? ? ? ? ?// 設(shè)S1為輔助串空間
? ? if (pos < 1 || pos > sl+1)
? ? ? ? return 0; ? ? ? ? ? ? ? // 插入位置不合法;
? ? if (tl>0)
? ? {
? ? ? ? int i=0,k,j;
? ? ? ? while ( S.data[i]!='\0')
? ? ? ? {
? ? ? ? ? ? S1[i]=S.data[i];
? ? ? ? ? ? i++;// 暫存串S
? ? ? ? }
? ? ? ? S1[i]='\0';
? ? ? ? S.data= (char *)malloc((sl + tl +1) *sizeof(char)); ? // 重新分配空間
? ? ? ? for ( i=0, k=0; i<pos-1; i++)
? ? ? ? {
? ? ? ? ? ? S.data[k++] = S1[i];
? ? ? ? ? ? // 保留插入位置之前的子串
? ? ? ? }
? ? ? ? j = 0;
? ? ? ? while ( T.data[j]!= '\0')
? ? ? ? {
? ? ? ? ? ? S.data[k++] = T.data[j++];
? ? ? ? } ? ? // 插入T
? ? ? ? while ( S1[i] != '\0')
? ? ? ? ? ? S.data[k++] = S1[i++]; ?// 復(fù)制插入位置之后的子串
? ? ? ? S.data[k] = '\0';
? ? ? ? S.length=k; ? ? ? ? ? ? ? ? ? ? ?// 置串S的結(jié)束標(biāo)志
? ? }
}
/**輸出**/
void StrOutput(sqtr S)
{
? ? int i=0;
? ? while(i<S.length)
? ? {
? ? ? ? cout<<S.data[i];
? ? ? ? i++;
? ? }
}V
總結(jié)
- 上一篇: HTML之标签
- 下一篇: 1260 不一样的A+B