Chapter 4 串

一、串的基本概念和存储结构

  1. 串的定义:由零个或者多个字符组成的有限序列。串中字符的个数为串的长度,含有零个元素的串叫空串。
  2. 串的C语言定义:
char str[]=“abcdef”
  1. 关于空格串:空格串不是空串,一个空格占一个位置。
  2. 串的结束符:‘\0’
  3. 串的存储结构:

(1)定长顺序存储:

typedef struct {
    char str[maxSize+1];
    int length; //保存串长度的分量。
} Str;

(2)变长分配存储表示:(有顺序存储结构的特点,串长根据需要设定)

typedef struct {
    char *ch;   //指向动态分配存储区首地址的字符指针
    int length;  
} Str;

二、串的基本操作

  1. 赋值操作:(没有理解透彻,在for循环那块)
    分清楚:ch, c和str.ch。
int strassign(Str &str, Char *ch){ //ch是原串指针
    if(str.ch){ //如果新串的指针ch不为空则释放原串空间
        free(str.ch);
    }
    int len=0;  //这个len是用来计算原串的长度
    Char *c=ch;  // 这里ch指针指的位置赋给c是为了不破坏原串指针ch的位置
    while(*c){     //求ch串的长度
        ++len;  //监测到的原串长度+1
        ++c;   //指针c跳到下一个原串相邻的存储单元
    }
    if(len==0){ //如果原串长度为0,则给新串str赋值一个空串,并设定length分量为0 
        str.ch=NULL:
        str.length=0;
        return 1;
    }
    else{  //原串长度大于等于1,则开始分配空间进行一个个元素的赋值操作
        str.ch=(char*)malloc((len+1)*sizeof(Char))  //str.ch指的是串str的ch【指针】分量
        if(str.ch==NULL).   //如果分配空间操作不成功,返回操作失败标志
            return 0;
        else{
            c=ch; //c重新指向原串指针ch所指的第一个元素位置
            for(int i=0; i<=len; i++). //有等号的原因是有结束符。
                str.ch[i]=*c; //指针c指向的元素顺序赋值给新串的指针ch所指的位置(*c就是c当前指的元素)
            str.length=len;
            return 1; 
        }
    }
}

调用:strassign(str,”abcd efg”);

2.取串长度:

int strlength(Str str){
    return str.length;
}
  1. 串比较操作:(字典排序)
    比的是字符的ASCII码
    eg
    A:acdf;
    B:acefga;(结果是A>B)
int strcompare(Str s1, Str s2){
    for(int i=0; i<s1.length&& i<s2.length; i++){
        if(s1.ch[i] != s2.ch[i])
            return s1.ch[i]-s2.ch[i];
    }
    return s1.length-s2.length;  //如果for循环结束了还没返回(说明其中一个串必定是另一个串的字串)
}
  1. 串连接操作:
int concat(Str& str,Str s1, Str s2){
    if(str.ch){
        free(str.ch);
        str.ch=NULL; //???????
    }
    str.ch=(char*)malloc(sizeof(char)*(s1.length+s2.length+1));//没有吧s1的结束符存入。
    if(str.ch==NULL)
        return 0;
    else {
        int i=0;
        while(i<s1.length){ //第一个串不要放入结束符
            str.ch[i]=s1.ch[i];
            ++i;
        }  //现存入一个串;
        int j=0;
        while(j<=s1.length){ //这里就要放入结束符了。
            str.ch[i+j]=s1.ch[j];
            ++j;
        }
        str.length=s1.length+s2.length; //不要忘了改长度分量
        return 1;
     }
}
  1. 求字串操作:(求串str从开始位置pos起,长度为len的字串substr)
int substring(Str &substr, Str str, int pos, int len){
    if(pos<0||pos>=str.length||len<0||len>str.length-pos)
        return 0;   //非法操作返回0
    if(substr.ch){
        free(substr.ch);
        substr.ch=NULL;
    }
    else if(len==0){   //求的字串长度为0返回的substr为空串
        substr.ch==NULL;
        substr.length=0;
        return 1;
    }
    else {
        substr=(Char*)malloc(sizeof(Char)*(len+1));
        for(int i=0; i<=len; i++){
            substr[i]=str[pos+i];
        }
        substr[len-1]=‘\0;
        substr.length=len;
        return 1;
    }
}
  1. 串清空操作:最简单的一个操作(略)

三、简单模式匹配算法和KMP算法以及改进的KMP算法。(暂时空着)
要求:

  1. 了解简单模式匹配算法和KMP算法的区别。
  2. 掌握KMP算法的过程,会写出next数组。
  3. 了解KMP改进算法,会写出nextval数组。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值