4.1.1串的定义
- 串是由多个或者零个字符组成的有限序列。
- 串中字符的数目n称为串的长度。零个字符的串叫空串n=0。
- 串中任意个连续的字符组成的子序列称为该串的子串。包包含子串的串叫主串。
- 串相等长度相等,相应位置的字符也相等。
- 空格串就是由空格组成的字符串。
4.1.2串的存储结构
1、串的顺序存储结构
定长存储
#define MAXLEN 255
typedef struct{
char ch[MAXLEN+1];
int length;
}SString;
堆式存储
typedef struct{
char *ch;
int length;
}HString;
2、链式存储
#define CHUNKSIZE 80
typedef struct{
char ch[CHUNKSIZE];
struct ChunK *next;
}ChunK;
typedef struct{
ChunK *head,*tail;
int length;
}Lstring;
4.1.3串的模式匹配
子串的定位运算通常叫模式匹配或者串匹配
BF算法
int Index_BF(SString s,SString t,int pos){
int i=pos ,j=1;
while(i<=s.length &&j<=t.length){
if(s.ch[i]==t.ch [j]){
i++;
j++;
}else{
i=i-j+2;
j=1;
}
}
if(j>t.length)return i-t.length;
else return 0;
}
KMP算法
int Index_KMP(SString s,SString t,int pos){
int next[t.length];
get_next(t,next);
int i=pos,j=1;
while(i<=s.length && j<=t.length){
if(j==0||s.ch[i]==t.ch[j]){
j++,i++;
}else{
j=next[j];
}
}
if(j>t.length)return i-t.length;
else return 0;
}
void get_next(SString t,int next[]){
int i=1,j=0;
next[1]=0;
while(i<t.length){
if(j==0||t.ch[i]==t.ch[j]){
++i,++j,next[i]=j;
}else{
j=next[j];
}
}
}
4.2.1数组定义
- 数组是相同类型数据元素组成的有序集合,每个元素称为数组元素。
- 数组属于线性表的推广。
4.2.2数组储存
- 由于数组建立一般不做插入和删除操作所以数组建立元素关系和元素个数就不再变动。所以一般用顺序储存
4.2.3矩阵压缩储存
- 对称矩阵 下三角sa[n(n+1)/2],k为对应下标。
k=i(i-1)/2+j-1,j<=i;
k=j(j-1)/2+i-1,j>i;
- 上三角
k=(i-1)(2n-i+2)/2+(j-i),i<=j;
k=n(n+1)/2,i>j
下三角
k=i(i-1)/2+j-1,i>=j;
k=n(n+1)/2,i<j