1. 程式人生 > >字串的基本操作(資料結構)

字串的基本操作(資料結構)

        

具體操作如下:

1.定義串:

typedef struct  
{
    char data[Maxsize];
    int length;
} SqString;
2.輸入串:

void StrAssign(SqString &s,char cstr[])
{
    int i;
    for(i=0; cstr[i]!='\0'; i++)
        s.data[i]=cstr[i];
    s.length=i;
}
3.  串的複製
void StrCopy(SqString &s,SqString t)
{
    for(int i=0; i<t.length; i++)
        s.data[i]=t.data[i];
    s.length=t.length;
}
4.  判斷兩個順序串s和t是否相等
bool StrEqual(SqString s,SqString t)
{
    bool same=true;
    if(s.length!=t.length)
        same=false;
    else
        for(int i=0; i<s.length; i++)
            if(s.data[i]!=t.data[i])
            {
                same=false;
                break;
            }
    return same;
}
5.求串長  返回順序串s的長度
int StrLength(SqString s)
{
    return s.length;
}
6.串的連結  返回由兩個順序串s和t連結在一起形成的結果串
SqString Concat(SqString s,SqString t)
{
    SqString str;
    str.length=s.length+t.length;
    for(int i=0; i<s.length; i++)
        str.data[i]=s.data[i];
    for(int i=0; i<t.length; i++)
        str.data[s.length++]=t.data[i];
    return str;
}
7.  求子串  返回子串
SqString SubStr(SqString s,int i,int j)
{
    int k;
    SqString str;
    str.length=0;
    if(i<=0||i>s.length||j<0||i+j-1>s.length)
        return str;
    for(k=i-1; k<i+j-1; k++)
        str.data[k-i+1]=s.data[k];
    str.length=j;
    return str;
}
8.  子串的插入  將順序串s2插入到順序串s1的第i個位置上,並返回產生的結果
SqString SubStr(SqString s1,int i,SqString s2)
{
    int j;
    SqString str;
    str.length=0;
    if(i<=0||i>=s1.length+1)
        return str;
    for(j=0; j<i-1; j++)
        str.data[j]=s1.data[j];
    for(j=0; j<s2.length; j++)
        str.data[i+j-1]=s2.data[j];
    for(j=i-1; j<s1.length; j++)
        str.data[s2.length+j]=s1.data[j];
    str.length=s1.length+s2.length;
    return str;
}
9.  子串的刪除   在順序串s中刪除從第i個字元開始的長度為j的子串,返回產生的結果
SqString DelStr(SqString s,int i,int j)
{
    SqString str;
    str.length=0;
    if(i<=0||i>s.length||i+j>s.length+1)
        return str;
    for(int k=0; k<i-1; k++)
        str.data[k]=s.data[k];
    for(int k=i+j-1; k<s.length; k++)
        str.data[k-j]=s.data[k];
    str.length=s.length-j;
    return str;
}
10   子串的替換  在在順序串中將第i個字元開始的連續j個字元夠成的子串用順序串t替換
 返回產生的結果
SqString RepStr(SqString s,int i,int j,SqString t)
{
    SqString str;
    str.length=0;
    if(i<=0||i>s.length||i+j-1>s.length)
        return str;
    for(int k=0; k<i-1; k++)
        str.data[k]=s.data[k];
    for(int k=0; k<t.length; k++)
        str.data[i+k-1]=t.data[k];
    for(int k=i+j-1; k<s.length; k++)
        str.data[t.length+k-j]=s.data[k];
    str.length=s.length-j+t.length;
    return str;
}

11.  輸出串  輸出順序串s
void DisStr(SqString s)
{
    if(s.length>0)
    {
        for(int i=0; i<s.length; i++)
            printf("%c",s.data[i]);
        printf("\n");
    }
}


具體例題:

串採用順序儲存,設計一個演算法Strcmp(s,t)按字典序比較兩個串s和t的大小


解題思路:

(1)比較s和t兩個串共同長度範圍內的字元
若s的字元大於t的字元,返回1;若s的字元小於t的字元,返回-1;若s的字元等於t的字元,按上述規則繼續比較;

當(1)中的對應字元均相等時比較s和t的長度
s的長度大於t的長度,返回1;s的長度小於t的長度,返回-1;


int Strcmp(SqString s,SqString t)
{
    int i,comlen;
    if(s.length<t.length)
        comlen=s.length;
    else
        comlen=t.length;
    for(i=0; i<comlen; i++)
    {
        if(s.data[i]>t.data[i])
            return 1;
        else if(s.data[i]<t.data[i])
            return -1;
        if(s.length==t.length)
            return 0;
        else if(s.length>t.length)
            return 1;
        else
            return -1;
    }
}