考研数据结构有关串的总结归纳及代码实现
一、串的基本概念
字符串(String):是由零个或多个字符组成的有限序列,记为:S = ′a1 a2 … an′( n ≥ 0 ) ai∈V字符集合,每个 ai( 1 ≤ i≤ n)可以是字母、数字或其他字符。 串也是一种特定的线性表,串的逻辑结构和线性表极为相似,其特定性仅在于串的数据对象限定为字符集。
- 串的名字:S
- 串的值:用单引号括起来的字符序列
- 串的长度:n 是串中字符的个数
- 空串( Null String):n=0 时的串
- 空格串(空白串):一个或多个空格组成的串,其长度为空格个数。
- 串相等:当且仅当两个串的值相等时,称这两个串是相等的。即只有当两个串的长度相等,并且每个对应位置的字符都相等时才相等。
- 子串:串中任意个连续的字符组成的子序列称为该串的子串。
- 主串:包含子串的串相应地称为主串。可见,子串是主串的一部分。
- 求子串:sub(主串,起始位置,长度) 例:sub(‘china’,2,2)=‘in’ 模式串在主串种的位置(串的模式匹配): 从主串起始位置起,模式串在主串种首次出现的位置序号 例:主串‘chinachina’模式串‘in’ 如起始位置为0,则模式串第一个字符在主串种的位置为2 如起始位置为3,则模式串第一个字符在主串种的位置为7
二、串的顺序存储表示
特点:用一组地址连续的存储单元存储串值的字符序列
//1.串的定长存储
#define MaxSize 50
typedef struct SString{
char str[MaxSize+1];
int length;
}SString;
//2.串的变长存储
typedef struct HString{
char *ch;
int length;
}HString;
三、顺序串的基本操作
1.串的初始化
- 目标:初始化一个空串S。
#define OVERFLOW 0
#define OK 1
#define InitSize 50
//3.顺序串的初始化
int InitString(HString &S){
S.ch = (char *)malloc(sizeof(char)*InitSize);
if(!S.ch)
exit(OVERFLOW);
S.length = 0;
return OK;
}
2.求串长
- 目标:返回当前串的长度(不包含‘\0的长度’)
//4.求串长
int SteLength(HString S){
return S.length;
}
3.串的插入
- 目标:在串S的第pos个字符之前(包括尾部)插入串T
#define ERROR 0
#define TRUE 1
//5.串的插入基本操作
int StrInsert(HString &S,int pos,HString T){
if(pos<1||pos>S.length+1)
return ERROR;
if(T.length){
S.ch = (char *)realloc(S.ch,(S.length+T.length)*sizeof(char));
if(!(S.ch))
exit(OVERFLOW);
for(i=S.length-1;i>=pos-1;i--)
S.ch[i+T.length] = S.ch[i];
for(i=0;i<T.length;i++)
S.ch[i+pos-1] = T.ch[i];
S.length+=T.length;
}
return TRUE;
}
4.串的比较
- 目标:比较字符串S与T的大小,若S>T则返回正数,若S<T,则返回负数,若S=T,则返回0。
//5.串的比较
int StrCompare(HString S,HString T){
for(int i=0;i<S.length&&i<T.length;i++)
if(S.ch[i]!=T.ch[i])
return S.ch[i]-T.ch[i];
return S.length-T.length;
}
5.串的指派(串的赋值操作)
目标:把当前chars指针指向的字符串指派给T,若T中已有数据则清空后再指派。
//6.串的指派(串的赋值操作)
int StrAssign(HString &T,char *chars){
if(T.ch)
free(T.ch);
char *c;
int i;
for(i=0,c=chars;*c!='\0';++i,++c);
if(!i){
T.ch = NULL;
T.length = 0;
}
else{
if(!(T.ch=(char *)malloc(i*sizeof(char))))
exit(OVERFLOW);
for(int j=0;j<i;j++)
T.ch[j]=chars[j]; //chars[j]等价于*c、*chars
T.length = i;
}
return TRUE;
}
6.求子串
- 目标:将串S中从第pos个字符开始长度为len的字符序列复制到串Sub中。
//7.求子串
int GetSubString(HString &SubStr,HString S,int pos,int len){
if(pos<1||pos>S.length||len<0||len>S.length-pos+1)
return ERROR;
if(SubStr.ch){
free(SubStr.ch);
SubStr.ch = NULL;
}
if(len==0){
SubStr.ch=NULL;
SubStr.length=0;
return TRUE;
}
else{
SubStr.ch = (char *)malloc(sizeof(char)*(len+1));
for(int i=pos-1,j=0;i<pos+len;i++,j++)
SubStr.ch[j] = S.ch[i];
SubStr.ch[len] = '\0';
SubStr.length = len;
return TRUE;
}
}