串代码实现-C++

抽象数据类型

ADT String
{
    数据对象:
        D={ai | 1<=i<=n,n>=0,ai为char类型}
    数据关系:
        R={<ai,ai+1} | ai、ai+1 属于 D, i=1, ... ,n-1}
    基本运算:
        StrAssign(&s,cstr):将字符串常量cstr赋给串s,即生成值为cstr的串s
        DestroyStr(&s):销毁串,释放为串s分配的存储空间
        StrCopy(&s,t):串复制,串t赋给串s
        StrEqual(s,t):判串是否相等
        StrLength(s):求串长
        Concat(s,t):串连接
        SubStr(s,i,j):求子串,返回s中从i开始的连续j个字符
        InsStr(s1,i,s2):子串插入,s2插入s1的第i个位置
        DelStr(s,i,j):子串删除,从s的第i个位置起删去连续j个字符
        RepStr(s,i,j,t):子串替换,从s的第i个位置起的连续j个字符替换成串t
        DispStr(s):串输出
}

顺序串

数据声明

typedef struct{
    char data[MaxSize];
    int length;
}SqString;

生成串

void StrAssign(SqString &s,char cstr[])
{
    int i;
    for (i=0;cstr[i]!='\0';i++)
        s.data[i]=cstr[i];
    s.length=i;
}

销毁串

void DestroyStr(SqString &s)
{ }

串的复制

void StrCopy(SqString &s,SqString t)
{
    int i;
    for(i=0;i<t.length;i++)
        s.data[i]=t.data[i];
    s.length=t.length;
}

串相等

bool StrEqual(SqString s,SqString t)
{
    bool same = true;
    int i;
    if(s.length!=t.length)
        same=false;
    else
        for(i=0;i<s.length;i++)
            if(s.data[i]!=t.data[i])
            {
                same=false;
                break;
            }
    return same;
}

求串长

int StrLength(SqString s)
{
    return s.length;
}

串连接

SqString concat(SqString s,SqString t)
{
    SqString str;
    int i;
    str.length=s.length + t.length;
    for(i=0;i<s.length;i++)
        str.data[i]=s.data[i];
    for(i=0;i<t.length;i++)
        str.data[s.length+i]=t.data[i];
    return str;
}

求子串

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];
    s.length = j;
    return str;
}

插入子串

SqString InsStr(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;
}

删除子串

SqString DelStr(SqString s,int i,int j)
{
    int k;
    SqString str;
    str.length=0;
    if(i<=0 || i>s.length || i+j>s.length+1)
        return str;
    for(k=0;k<i-1;k++)
        str.data[k] = s.data[k]
    for(k=i+j-1;k<s.length;k++)
        str.data[k-j]=s.data[k];
    str.length=s.length-j;
    return str;
}

替换子串

SqString RepStr(SqString s,int i,int j,SqString t)
{
    int k;
    SqString str;
    if(i<0 || i>s.length || i+j-1>s.length)
        return str;
    for(k=0;k<i-1;k++)
        str.data[k]=s.data[k];
    for(k=0;k<t.length;k++)
        str.data[i-k+1]=t.data[k];
    for(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;  
}

输出串

void DispStr(SqString s)
{
    int i;
    if(s.length>0)
    {
        for(i=0;i<s.length;i++)
            cout<<s.data[i];
        cout<<endl;
    }
}

实现StrCmp

--此处先比较字典序 , 再比较长度

s.length > t.length || s > t 返回1

s.length < t.length || 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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值