数据结构之串(C/C++实现)

定义

串是由零个或者多个字符组成的有限序列,又名叫字符串
串中的字符数目n称为串的长度,
零个字符的串称为空串

串的比较

如silly和stupid,第一个字母都是s,我们认为不存在大小差异,而第二个字母,由于i字母比t字母要靠前,所以i<t,于是,我们说silly<stupid

事实上,串的比较是通过组成串的字符之间的编码来进行比较的。字符的编码指的是字符在对应字符集中的序号
常用的字符使用的标准是ASCII编码。共可以表示128个字符。
后来由于128个不够用,扩展的ASCII码由8位2进制表示一个字符,总共可以表示256个字符,这已经可以满足以英语为主的语言和特殊字符进行输入,存储,输出等操作的字符需要了。
但是我国的汉语,及很多少数名族的语言,显然256个字符远远不够,因此就有了unicode编码。比较常用的是由16位二进制数表示一个字符。约6.5万个字符,足够表示世界上所有语言的所有字符了。为了和ASCII兼容,Unicode的前256个字符与ASCII完全相同。

串的抽象数据类型

ADT 串
Data
 串中元素仅由一个个字符组成,相邻元素具有前驱和后继关系
 Operation
      StrAssign(T,*chars):    生成一个其值等于字符串常量chars的串T
      StrCopy(T,S):   若串S存在,由串S复制得到串T
      ClearString(S):    若串S存在,则清空
      StringEmpty(S):
      StrLength()
      StrCompare(S,T)   :若S>T  返回>0   若S=T 返回0,若S<T 返回<0
      ConCat(T,S1,S2) : 用T返回由S1和S2联接而成的新串
      SubString(Sub,S,pos,len)   串S存在,pos,和len符合取值范围,用sub返回串S的第pos个字符起长度为len的子串
      Index(S,T,pos):  串S和T存在,T是非空串,若主串S中存在和串T值相同的子串,则返回它在主串S中第pos个字符之后第一次出现的位置,否则返回0.
      Replace(S,T,V): 若串S,T和V存在,T是非空串。用V替换主串S中出现的所有与T相等的不重叠的子串
      StrInsert(S,pos,T)
      StrDelete(S,pos,len)

串的存储结构

与顺序表一样,有两种存储方式:
顺序存储结构和链式存储结构

KMP模式匹配算法

朴素的匹配算法:

对主串的每一个字符作为子串的开头,与要匹配的字符串进行匹配。对主串做大循环,每个字符开头做需匹配长度的小循环,直到匹配成功或者全部遍历完成为止
实现算法:
功能:返回字串T在主串S中第pos个字符之后的位置,若不存在,则函数返回值为0

int Index(char*S,char *T)
{
    int i,j;
    //直到遍历主串完成或者需匹配字符串全部匹配成功
    for(i=0,j=0;i<(int)strlen(S)&&j<(int)strlen(T);)
    {
        if(S[i]==T[j])
        {
            i++;
            j++;
        }
        else {
            //如果当前字符不同,则主串进行回溯,跳转到当前匹配首位的下一位
            i=i-j+1;
            j=0;
        }
    }
    if(j==(int)strlen(T))
    {
        return i-j+1;
    }
    else {
        return -1;
    }
}

KMP匹配算法:
关于KMP算法的介绍参考这篇文章:
https://blog.csdn.net/LunaW/article/details/78783720

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值