串的基本操作 總結 參考網上
阿新 • • 發佈:2019-02-05
#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); //銷燬 void StrCopy (sqtr &T,sqtr S); //複製 int StrLength(sqtr S); //長度 int StrEmpty (sqtr S); //判空 void Concat (sqtr &T,sqtr S1,sqtr S2); //串聯接 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); //定位函式 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個後S中與T相等的子串的位置"; cout<<Index(S,T,3); cout<<endl; cout<<"求第3個後S中長度為3的子串"; SubString(Sub,S,3,3); StrOutput(Sub); cout<<endl; cout<<"在串S的第10個字元之前插入串T:"; StrInsert(S,10,T); StrOutput(S); cout<<endl; cout<<"刪除串S從第2個字元起長度為3的子串:"; StrDele(S,2,3); StrOutput(S); cout<<endl; cout<<"連線T,V到S1"; Concat(S1,T,V); StrOutput(S1); cout<<endl; //cout<<"\n"<<"採用KMP演算法進行模式匹配:"; //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; } /**長度**//*strlen(S.data);*/ int StrLength(sqtr S) { return S.length; } /**判空**/ int StrEmpty (sqtr S) { if(!S.length) //長度=0 return 1; else return 0; } /**複製**//*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; } /**銷燬 似清空**/ 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有終止作用,誰先執行就return誰; } /**刪除**/ 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; } /**串聯接**/ 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 個字元起長度為 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'; } } /**定位函式**/ int Index (sqtr S,sqtr T,int pos) { //若主串 S 中存在和串 T 值相同的子串,則返回它在主串 S 中第 pos個字元之後第一次出現的位置; 否則函式值為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++;//相當於二重for迴圈中跳出j,進入i迴圈 j=0; } } if(T.data[j]=='\0') return i+1; else return 0; } } /**串置換**///用 V 替換主串 S 中出現的所有與模式串)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)//不能寫i,因為i是位置,不一定啥數 { 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);//當非第一次時,後面要直接連在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) 個字元之前插入串T char S1[sl+1] ; // 設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++]; // 複製插入位置之後的子串 S.data[k] = '\0'; S.length=k; // 置串S的結束標誌 } } /**輸出**/ void StrOutput(sqtr S) { int i=0; while(i<S.length) { cout<<S.data[i]; i++; } }