概念:
由零个或多个字符组成的有限序列
空串: 含零个字符的串, 用Φ表示(和空格串不同)
串长: 串中所含字符的个数
主串: 包含子串的串
子串: 一个串中任意个连续字符组成的子序列(含空串)成为该串的子串
字符在主串中的位置: 某个字符在主串的序号(位序从1开始)
子串在主串的位置: 用子串的第一个字符的位置来表示子串在主串的位置
串相等: 当且仅当两个串的长度相等, 且各对应的位置上的字符也相等时, 这两个串相等
"abcde"有多少个子串:
空串数:1
含一个字符的子串数: 5
含两个字符的子串数: 4
含三个字符的子串数: 3
含四个字符的子串数: 2
串本省: 1
共有子串数: 1+5+4+3+2+1 = 16
串的定义和存储
假设s=“408 150” , t=“”, sub=“150”, m=“985211”
StrAssign(&s, chars)
: 将一个字符串常量赋给串s, 即生成一个其值等于chars的串s
StrAssign(&s, I love 408)
, s=" I love 408"
StrCopy(&s, t)
: 串复制, 将串t赋给串s
StrCopy(&s, t)
, t=“408 150”
StrEqual(s,t)
判串相等, 若两个串s与t相等则返回真, 否则返回假
StrEqual(s, s) = 1
StrEqual(s, t) = 0
StrLength(s)
求串长, 返回串中的字符个数
StrLength(s) = 7
Contact(&t, s1, s2)
串连接, 返回由两个串s1和s2连接在一起形成新的串t
Contact(&t, sub, m)
, t=“150985211”
SubString(&sub, s, pos, len)
: 返回串s中从第pos(1≤pos≤StrLength(s)) 个字符起, 长度为length的子串
SubString(&t, s, 5, 3)
t = 150
index(s, t, pos)
: 返回主串t在主串s中的第pos(1≤pos≤StrLength(s))个字符后第一个出现的位置
index(s, sub, 1) = 5
index(s, sub, 6) = 0
StrInsert( &s, pos, t)
: 将串t插入到串s的第pos个字符的位置前
StrInsert(&s, 4, sub)="408105 150"
StrDelete(&s, pos, len)
从串s中删除从第pos个字符开始的长度为len的子串
StrDelete(&s, 4, 4) = "408"
Replace(&s, t, v): 用v替代主串s中出现的所有与t相等的不重叠的子串
Replace(&s, sub , "194")="408 194"
StrCompare(S; T): 比较操作
若S>T, 返回值大于0
若S==T, 返回值就是0
若S< T, 返回值小于0
比较原则:
1.从第一个字符开始往后依次对比, 先出现更大字符的串就更大
2.短串如果是长串的前缀, 那么长串就更大
3.只有完全相等的时候才相等
例题:
StrCompare(“408 150” ,“408 150”)==0
StrCompare(“abc” ,“abb”)==正数
StrCompare(“407 150” ,“408 150”)==负数
串的顺序存储
串是一种特殊的线性表, 它的每个结点仅由一个字符组成
顺序串: 把串中字符依次存储在一片相邻的内存空间
定长顺序存储
typedef struct {
char ch [MaxLen];
int length;
}SString
变长顺序存储(堆分配存储方式)
typedef struct {
char *ch;
int length ;
}HString
ch (char *)malloc (MaxLen* sizeof(char));
链式存储
typedef struct StringNode{
char ch;//每个结点1B
struct StringNode * next ;//指针大小和计算机寻址范围相关
}StringNode, *String;
typedef struct StringNode{
char ch[N];//每个结点存储N个字符
struct StringNode * next ;//指针大小和计算机寻址范围相关
}StringNode, *String;
三种存储方式的对比
定长循序存储:
串长超出最大长度时, 需要截掉尾部
串长过小, 则串空间浪费较大
堆分配
基于动态存储管理, 处理方便
链式存储
连接操作等处理有一定的方便
总体来说, 占用存储量大且操作复杂, 没有上述两种结构灵活
定长顺序串的基本实现
假设s=“408 150” , t=“”, sub=“150”, m=“985211”
#define MaxStrlen 255
typeof struct{
char ch[MaxStrlen ];
int length;
}SString;
下标为0的分量闲置不用
void StrAssign(SString &s, char t[]){//将一个字符串常量t赋值给串s
for(i = 0,j =1; t[i]!='\0';i++,j++){
s[j]=t[i];
s.length=j;//存放长度
}
}
将串t复制给串s
void StrCopy(SString &s, SString t){
for(int i =1, i<t.length; i++){
s[i]=t[i];
s.length = t.length;
}
}
判断两个串是否相等
int StrEqual(SString s, SString t){
int same = 1;
if(s.length != t.length){
same = 0;
}else{
for(int i =1;i<s.length;i++){
if(s[i]!=t[i]){
same = 0;
break;
}
}
return same;
}
}
返回串中第pos个字符起长度为len的子串
SString SubStr(SString &sub, SString s, int pos, int len){
for(int i =pos, int j=1; i<pos+len;i++,j++){
subStr.ch[j++]=S.ch[i];
}
sub.length=len;
}
比较两个串
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 ;
}