数据结构-串

概念:

由零个或多个字符组成的有限序列

空串: 含零个字符的串, 用Φ表示(和空格串不同)

串长: 串中所含字符的个数

主串: 包含子串的串

子串: 一个串中任意个连续字符组成的子序列(含空串)成为该串的子串

字符在主串中的位置: 某个字符在主串的序号(位序从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 ;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

稻田里展望者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值