1. 程式人生 > >串的基本操作 總結 參考網上

串的基本操作 總結 參考網上

#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++;
    }
}