一、串的基本概念和存储结构
- 串的定义:由零个或者多个字符组成的有限序列。串中字符的个数为串的长度,含有零个元素的串叫空串。
- 串的C语言定义:
char str[]=“abcdef”
- 关于空格串:空格串不是空串,一个空格占一个位置。
- 串的结束符:‘\0’
- 串的存储结构:
(1)定长顺序存储:
typedef struct {
char str[maxSize+1];
int length; //保存串长度的分量。
} Str;
(2)变长分配存储表示:(有顺序存储结构的特点,串长根据需要设定)
typedef struct {
char *ch; //指向动态分配存储区首地址的字符指针
int length;
} Str;
二、串的基本操作
- 赋值操作:(没有理解透彻,在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;
}
- 串比较操作:(字典排序)
比的是字符的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循环结束了还没返回(说明其中一个串必定是另一个串的字串)
}
- 串连接操作:
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;
}
}
- 求字串操作:(求串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;
}
}
- 串清空操作:最简单的一个操作(略)
三、简单模式匹配算法和KMP算法以及改进的KMP算法。(暂时空着)
要求:
- 了解简单模式匹配算法和KMP算法的区别。
- 掌握KMP算法的过程,会写出next数组。
- 了解KMP改进算法,会写出nextval数组。