数据结构-第4章 串
严蔚敏数据结构-第四章 串
15
(2)S1串长 最大串长 串长<最大串长 串长 最大串长; S1,S2串长和 最大串长 串长和>最大串长 串长和 最大串长;
S1 6 a b c d e f S2 6 g h i j k l T 8 a b c d e f g h
3
串的抽象数据类型的定义: 串的抽象数据类型的定义: ADT String{ 数据对象: 数据对象:D={ai|ai∈CharacterSet, i=1,2,...,n, n>=0} 数据关系: 数据关系:R1={<ai-1,ai>|ai-1,ai∈D, i=2,...,n} 基本操作: 基本操作: StrAssign(&T, chars)
11
作业: 作业: 1.用5种串的基本操作(StrAssign、StrCompare、StrLen Concat、SubString)来逻辑实现StrInsert(&S, pos, T)操作 、 操作. )
Status StrInsert(String S, int pos , String T) { if ……….. return error; , , ); ); ); );
chars是字符串常量。生成一个其值等于chars的串 。 是字符串常量。生成一个其值等于 的串T。 是字符串常量 的串
StrCopy(&T, S)
存在则由串S复制得串 串S存在则由串 复制得串 存在则由串 复制得串T
StrEmpty(S)
存在则若S为空串 串S存在则若 为空串 返回真否则返回假 存在则若 为空串,返回真否则返回假
Sub返回串 的第pos个字符起长度为 返回串S的第 个字符起长度为len的子串 用Sub返回串S的第pos个字符起长度为len的子串
数据结构——第4章 串(C#)
4.1.1 什么是串 串(或字符串)是由零个或多个字符组成的有限序列。 记作str="a1a2…an"(n≥0),其中str是串名,用双引号括 起来的字符序列为串值,引号是界限符,ai(1≤i≤n)是一 个任意字符(字母、数字或其他字符),它称为串的元素, 是构成串的基本单位,串中所包含的字符个数n称为串的 长度,当n=0时,称为空串。
4.2 串的存储结构
4.2.1 串的顺序存储结构-顺序串
和顺序表一样,用一个data数组(大小为MaxSize)和 一个整型变量length来表示一个顺序串,length表示data数 组中实际字符的个数。 定义顺序串类SqStringClass如下:
class SqStringClass { const int MaxSize=100; public char[] data; //存放串中字符 public int length; //存放串长 public SqStringClass() //构造函数,用于顺序串的初始化 { data=new char[MaxSize]; length=0; } //顺序串的基本运算 }
(9)串输出DispStr() 将当前串s的所有字符构成一个字符串并输出。对应的算 法如下:
public string DispStr() { int i; string mystr=""; if (length==0) mystr = "空串"; else { for (i=0;i<length;i++) mystr+=data[i].ToString(); } return mystr; }
数据结构 第四章 串
4.1 4.2
串类型的定义 串的表示和实现
4.2.1 定长顺序存储表示 4.2.2 堆分配存储表示 4.2.3 串的块链存储表示
第四章 串
4.1 串类型的定义
一、串的基本概念 定义:字符串是 n ( 0 ) 个字符的有限序列
记作 S = “c1c2c3…cn”
其中:
S 是串名字 “c1c2c3…cn”是串值 ci 是串中字符 n 是串的长度
4.1 串类型的定义
一、串的基本概念
串中任意个连续字符组成的子序列称为该串的
子串,包含子串的串相应地称为主串。
子串在主串中首次出现时的该子串的首字符 对应的主串中的序号,定义为子串在主串中的
序号(或位置)
例如,设A和B分别为 A=“This is a string” B=“is”
4.1 串类型的定义
提取子串的算法示例
pos = 3, len = 3 infini ty
pos = 6, len = 4 infini ty
fin
len S[0]-pos+1
超出 len > S[0]-pos+1
合法参数条件: Pos>=0, Pos<=S[0], Len>=0
len <=S[0]-pos+1
求子串的过程即为复制字符序列的过程,将串S中的 第pos个字符开始长度为len的字符复制到串T中。
1、串的插入的动态实现过程 s.length+ t.length
SA
l o v el y
pos Tl o
t.length
vely
g irl!
t.length
1、串的插入的动态实现过程 s.length+ t.length
数据结构第4章 串
/*若串s和t相等则返回0;若s>t则返回正数;若s<t则返 回负数*/
{ int i;
for (i=0;i<s.len&&i<t.len;i++)
if (s.ch[i]!=t.ch[i]) return(s.ch[i] - t.ch[i]);
初 始 条 件 : 串 S 存 在 ,1≤pos≤StrLength(S) 且 1≤len≤StrLength(S)-pos+1
操作结果:用Sub返回串S的第pos个字符起长度为len的子串
返回主目录
(11)StrIndex(S,T,pos)
初始条件: 串S和T存在,T是非空串, 1≤pos≤StrLength(S)
return(s.len); }
返回主目录
(7)清空函数
StrClear(SString *s) /*将串s置为空串*/ {
s->len=0; }
返回主目录
(8)连接函数
(1) 连接后串长≤MAXLEN,则直接将B加在A的 后面。 (2) 连接后串长>MAXLEN且LA<MAXLEN,则B 会有部分字符被舍弃。 (3) 连接后串长>MAXLEN且LA=MAXLEN,则B 的全部字符被舍弃(不需连接)。
for (i=s->len + t.len-1;i>=t.len + pos;i--)
s->ch[i]=s->ch[i-t.len];
for (i=0;i<t.len;i++) s->ch[i+pos]=t.ch[i];
s->len=s->len+t.len;
数据结构--第四章 串
则:串s3是s1的子串, s1是s3的主串;
串s2不是s1的子串
5
串的概念
串的位置:字符在序列中的序号为 该字符在串中的位置。子串在主 串中的位置则以子串的第一个字 符在主串中的位置来表示。特别 地,空串是任意串的子串,任意 串是其自身的子串。 例如: s1=’I have a dog’; s3=’dog’ 则:子串s3在s1中的位置为匹配(求子串位置) 第一趟:
i=1
a b a b c a b c a c b a b
J=1
a b c
31
串基本操作的实现 —— 串的模式匹配(求子串位置) 第一趟:
i=3
a b a b c a b c a c b a b
J=3
a b c
32
串基本操作的实现 —— 串的模式匹配(求子串位置) 第二趟:
D A T A S T R U C T U R E
D U R
A S C E
T T T
A R U
19
串的存储结构——动态存储结构
串的动态存储方式采用链式存储结构 和堆存储结构两种形式: (一) (二) 块链存储 堆结构
20
串的动态存储结构 ——块链存储的引入
用单链表存放串,每个结点仅存储一个字符, 每个结点的指针域所占空间比字符域所占空间 要大得多。定义如下: typedef struct node{ char ch; struct node *next;
9
串的基本操作定义
⑵ 判等函数:Equal(s,t)
若s和t相等, 则返回函数值(即运算结 果)1, 否则返回函数值 0。s和t可以是 非空串,也可以是空串。 例如, 执行Equal (a,b) 后, 值为0。 执行Equal (‘abc’,‘abc’) 后, 值为1。
数据结构第四章(串)
return ERROR;
Sub[1…len]=S[pos…pos+len-1]; Sub[0]=len; return OK; }//SubString
小结:串的顺序存储结构特点: 实现串操作的原操作为“字符序列的复制 ”,操作的时间复 杂度基于复制的字符序列的长度;
如果在操作中出现串值序列的长度超过上界MAXSTRLEN时, 约定用截尾法处理。
1. 类似顺序表,定义一个表示串长度的域;
typedef struct { char ch[MAXSTRLEN];
int len;
}SqString;
2.串长可用下标为0的数组元素存储; 3.也可在串值后设特殊标记,‘\0‟:
a[0]
3 a
a[1]
a b
a[2]
b c
a[3]
c \0
a[4]
a[5]
}
else { // S1[0] = MAXSTRSIZE截断(仅取S1) T[0..MAXSTRLEN] = S1[0..MAXSTRLEN]; uncut = FALSE; }
return uncut;
} // Concat
2.求子串SubString(&Sub,S,pos,len)
Status SubString(Sstring &sub,Sstring S, int pos , int len){ //其中,1=<pos<=StrLength(s)且 0=<len<=StrLength(s)-pos+1。 //用sub返回S串中从第pos个位置开始,长度为len的字符串 if (pos<1|| pos>s[0] || len<0 || < len>S[0]-pos+1)
《数据结构》--第四章 串
4.3 串的基本运算
4、插入子串: insert(s,s1,i) 在串s的第i个位置插入串s1。 5、删除子串: delete(s,i,j) 从串s的第i个位置开始,连续删除j个 字符。 6、子串定位: match(s,s1) 返回子串s1在串s中第一次出现的位置。 7、子串替换: replace(s,s1,i,j) 将串s中从第i个位置开始的长度 为j的子串用串s1来替换。
1. 串连接
串连接就是把两个串连接在一起,其中一个 串接在另一个串的末尾,生成一个新串。 如给出两个串s1和s2,把s2连接到s1之后, 生成一个新串s。
1. 串连接
例如,有两个串分别为s1 = ″Good ″, s2 = ″morning!″,则调用函数connect(s1, s2) 后,生成一个新串s = ″Good morning!″
4.2 串的存储结构
4.2.1 串的静态存储结构
串的静态存储结构采用顺序存储结构,简称为顺 序串。在计算机中,一个字符只占一个字节,所以串 中的字符是顺序存放在相邻字节中的。 串的顺序存储可用一个字符型数组和一个整型变 量来表示,其中字符型数组存放串值,整型变量存放 串的长度。
4.2 串的存储结构
4.2.2 串的链式存储结构
串的链式存储结构也称为链串,结构与链表类似,链串 中每个结点有两个域,一个是值域(data),用于存放字符 串中的字符,另一个是指针域(next),用于存放后继结点 的地址。 一个链串一般是由头指针唯一确定的。
优点:插入、删除运算很方便。
4.2 串的存储结构
存储密度 = 串值所占的存储位 / 实际分配的存储位 为了提高存储密度,可让每个结点的值域存放多个字符。 这种结构也叫做大结点结构。 如串s = “good morning!”的存储结构如下图所示。
最新课件-数据结构教学第4章串 精品
struct list struct list * next; /* 指向下一个结点的指针 */ char data; /* 字符 */
} * point; /* point为结构类型的指针, 指向第一结点 */ 根据上述说明, 字符串′string′的链表存储可用图4.1表示。 如果链表中每个结点可存放4个字符, 则结点结构为: struct list struct list * next;
4.2.2 串的链表存储
由于各种串运算与串的存储方式有密切关系 , 若要随机存 取串中第K个字符, 顺序存储显得比较方便; 若要对串进行插入、 删除等操作, 顺序存储就显得比较繁琐, 而链表存储则显示出 明显的优越性。
链表存储是把可利用的存储空间分成一系列大小相同的 结点 ( 若干连续的存储单元 ), 每个结点含有两个域 : data 域和 next域。 data域用来存放字符; next域用来存放指向下一个结点 (首地址)的指针。 结点的大小是指data域中可以存放字符的个 数, next域的大小则取决于寻址的范围。
元中仅放一个字符。 在一个程序中使用的串变量较少, 且各串 变量的长度又都较短时,如果希望该程序处理字符的速度尽 可能快, 那么选择非紧缩格式比较合适。 在这种存储格式中, 串的长度是隐式的, 串所占用存储单元的个数即为串长。
例: 假设一存储单元可以存放4个字符, 同样对于字串(This is a flag), 共需14个存储单元, 其存放的直观表示如表 4.2。 这 种存储格式对存储空间的利用率仅为25%, 但如上所述, 该方法 在字符加工处理方面会节省时间。 3) 某些计算机( 如一般的微型计算机 ), 是以字节为存取单位 的, 一个字符通常又占用一个字节, 这就自然形成了每个存储 单位存放一个字符的分配方式。这种方式一般不需要存放串 长的存储单元, 而需要以程序中各变量值所不包含的字符作为 结束符。 例: 在C语言中, 字符串存放在一个连续的存储单元中, 一 个字符占一个字节。对于字符串′STRING′, 在微机中只需 7 个 存储单元。直观表示如下:
数据结构第四章串
(2) 置换操作:用联接算法来实现。用在求子串序号(a,b,h)中得到的 ind 将a分成3部分:第一部分是b在a中的第一个位置前的子串substr (a,1,ind-1);第二部分是b(以c来代替);第三部分是b在a中的最后一个 位置后的子串substr(a,ind+m,n)。 即 a substr(a,I,ind-1)||c||substr(a,ind+m,n)
4. 2 串的基本运算
对于串的基本操作,许多高级语言均提供了相应的运算或标准 库函数来实现。下面仅介绍几种常用的串运算。 (1)联接(concatenation) 联接是串的最基本,最重要的运算。两个串的联接是将一个串 紧接着放在另一个串的末尾。联接用符号“||”表示。 例如:a=”bei” b=“jing” a || b=“beijing” (2)求子串(substr) SUBSTR(a,m,n)功能: 从a 中截取子串,从第m个字符到第n个 字符的子串(m<n)。子串应是将串a中取出从标号m开始的连续n -m+1个字符。 例:SUBSTR(“ABCDEFG”,2,3)=”BC” 利用求子串及联接两种运算可以完成对串的插入、删除和修改。 例如: a=“bejing” b=“iy” ,将b插入到a的第二个字符之后 得到新的串s,则 s=substr(a,1,2) || b || substr(a,3,6) =“beiyjing”
(5)置换(repleace) 置换运算repleace(a,b,c)表示在a中搜索b,若b是a的 子串,就以c代替b,若不是,则经置换后,a不变。 例如:a=“monday”, b=“mon”, c=“thurs” repleace(a,b,c)=“thursday” 置换运算是将串a中所有的子串b用c来代替。 在一部分程序设计语言中没有实现,仍可用前三种运 算来完成。 置换算法过程:实现置换运算repleace(a,b,c),同 样也是在a中搜索是否与b相同的子串,若有,以c来代 替,再继续向下搜,直到在a中找不到和b相同的子串 为止。
数据结构第4章串
设主串s=“ababbabbcda”,模式t=“abbcd”:
↓i=3
第1趟: a b a b b a b b c d a a b b
↑j=3 ↓i=2
第2趟: a b a b b a b b c d a a
↑j=1 ↓i=6
第3趟: a b a b b a b b c d a a b b c
↑j=4
设主串s="ababbaabbabbcde",子串t=" abbabb " 第1 趟 a b a b b a a b b a b b c d e a b b a b b
↑j=3 next[3]=1 ↓i=3
第2 趟 a b a b b a a b b a b b c d e a b b a b b
串的堆存储结构
在C语言中 ,提供了一个称之为“堆” 的共享空间,可以在程序运行过程中, 由系统利用函数malloc( )和free( )来动 态地申请或释放一块连续空间。 串的堆式存储结构仍属于串的顺序存储 结构范畴,但与前面的定长顺序存储方 式存在的区别在于其存储空间是在程序 执行过程中动态分配的,而不是静态分 配的。
• KMP算法:
int KMP _ StrIndex (char *s,char *t,int pos)
/*从主串s的第pos个字符开始找首次与模式串t相等的子串*/
{ int i=pos,j=1,slen,tlen; while (i<=s[0] && j<=t[0] ) if (j==0||s[i]==t[j]) { i++; j++; } else j=next[j]; /*j指针回溯*/ if (j>t[0]) return i-t[0]; else return 0; }
数据结构 串
1第4章串主要内容: 串的基本概念 串的定长顺序表示 串的堆分配存储表示 串的块链存储表示2串的概述串是一种常用于非数值处理的线性结构从数据结构角度看,串是一种线性表,其特殊之处在于其数据元素类型被限定为字符。
因此也可以称串是一种特殊的线性表。
从数据类型来看,串由字符构成,其操作特点和线性表大不相同,是完全不同的数据类型。
串通常以串的整体作为操作对象,因为串中的单个元素常常是无意义的。
而线性表的操作对象多以单个元素为操作对象串是元素类型被限制为字符的特殊线性表3§ 4.1 串的类型定义1. 串的基本概念串(String):是零个或多个字符组成的有限序列。
一般记作S= ‘a 1a 2a 3…a n ’,S 是串名,单引号括起来的字符序列是串值; a i (1≤i ≤n )可以是字母、数字或其它字符;i 是字符在序列中的序号,也称为该字符在串中的位置。
n 是串中所包含的字符个数,称为该串的长度。
引号不属于串。
两个串相等,当且仅当两个串值相等,即长度、位置相等。
4空串和空白串空串(Empty String):长度为零的串,不包含任何字符。
空白串(Blank String):空格也是串集合中的一个元素,通常将仅由一个或多个空格组成的串称为空白串。
注意:空串和空白串不同。
例如“”和“”分别表示长度为1的空白串和长度为0的空串。
为了清楚起见,用“φ”来表示空串5子串和主串子串:串中任意个连续字符组成的子序列称为该串的子串。
主串:包含子串的串相应地称为主串。
B 是A 的子串。
B 在A 中出现了两次,B 在A 中的序号(或位置)为3。
注意:空串是任意串的子串,任意串是其自身的子串子串的位置:通常将子串在主串中首次出现时,该子串首字符对应的主串中的序号,定义为子串在主串中的序号(或位置)。
例如:设A=“This is a string”,B=“is”。
问B 是A 的子串吗?如果是,B 在A 中出现了几次?其位置是几?62. 串的抽象数据定义ADT string {数据对象: D 数据关系: R 基本操作:StrAssign(&S,chars);StrCopy(&S,S1); StrEmpty(&S);StrCompare(S1,S2);StrLength(S); ClearString(&S);Concat(&S,S1,S2); SubString(&Sub,S,pos,len);Index(S,Sub,pos); Replace(&S,Sub,T); StrInsert(&S,pos,Sub); StrDelete(&S,pos,len);DestroyString(&S);}ADT String7§4.2 串的顺序表示和实现串的顺序存储:即用一组地址连续的存储单元存储串值中的字符序列非紧缩格式:一个存储单元中只存放一个字符,所需存储单元个数即是串的长度。
《数据结构(清华版)》4第四章串和数组
CIICK HERE TO ADD A TITLE
单击添加副标题
《数据结构(清华版)》第四章串和数组
1
WORKREVIEW
串和数组基本概念
CATALOGUE
目录
2
串存储结构及操作实现
UNDERWORK
3
数组存储结构及操作实现
WORKHARVEST
4
串和数组应用问题求解
FUTUREOUTLOOK
并行化矩阵运算
利用并行计算技术,对稀疏矩阵进行分块处理,提高矩阵运算速度。
衬底1
算法设计技巧与经验分享
充分利用数据结构特性
根据数据结构的特性设计算法,能够简化算法流程并提高算法效率。
在设计算法时,要充分考虑边界条件对算法正确性和效率的影响,避免出现意外情况。
在算法设计过程中,要善于利用已有的库和工具,避免重复造轮子,提高开发效率。
数组的性质
数组是一种聚合数据类型,它是将具有相同类型的若干变量有序地组织在一起的集合;数组中的元素按一定顺序排列,每个元素都可以通过下标来访问;数组的下标从0开始,也可以是其他整数,但必须是连续的整数。
衬底1
串与数组关系
串和数组在实际应用中经常相互转换。例如,可以将一个字符串转换为一个字符数组进行处理,也可以将一个字符数组转换为一个字符串进行输出。
5
串和数组性能优化策略
UNDERWORK
6
实验与案例分析
WORKHARVEST
GENERAL WORK REPORT FOR FOREIGN
串和数组基本概念
单击此处添加文本具体内容
衬底1
串定义及性质
串是由零个或多个字符组成的有限序列,一般记为s='a1a2...an'(n>=0),其中s是串名,用单引号括起来的字符序列是串值,ai(1<=i<=n)可以是字母、数字或其他字符,串中字符的个数n称为串的长度。
数据结构-04串
4.1 串的定义和操作
例如:下面 , , , 都是串 例如:下面a,b,c,d都是串
a=“BEI” b=“JING” c=“BEIJING” d=“BEI JING” 长度为3 长度为 长度为4 长度为 长度为7 长度为 长度为8 长度为
串的逻辑结构和线性表极为相似, 串的逻辑结构和线性表极为相似,区别仅仅在于串 的数据对象约束为字符集 字符集。 的数据对象约束为字符集。但是串的基本操作和线 性表有很大的差别。 性表有很大的差别。 在线性表的操作中大多数以“单个元素” 在线性表的操作中大多数以“单个元素”为操作对 而在串的操作中大多数以“串的整体” 象,而在串的操作中大多数以“串的整体”为操作 对象。 对象。
“ ”; 和 “ ”;都是空格串。 都是空格串。
为了清楚起见我们以后用Φ来表示空串 为了清楚起见我们以后用Φ来表示空串
串的基本操作( ) 串的基本操作(1)
ADT String{ 数据对象: 数据对象 D={ai| ai∈CharacterSet,i=1,2,...,n,n≥0} 数据关系: 数据关系 R1={<ai-1, ai> | ai-1,ai∈D,i=2,...,n} 基本操作: 基本操作:
数据结构-第四章串
数据结构-第四章串串也叫字符串,它是由零个或多个字符组成的字符序列。
基本内容1 串的有关概念串的基本操作2 串的定长顺序存储结构,堆分配存储结构;3 串的基本操作算法;4 串的模式匹配算法;5 串操作的应⽤。
学习要点1 了解串的基本操作,了解利⽤这些基本操作实现串的其它操作的⽅法;2 掌握在串的堆分配存储结构下,串的基本操作算法;3 掌握串的模式匹配算法;第四章串 4.1 串的基本概念4.2 串存储和实现4.3 串的匹配算法4.4 串操作应⽤举例第四章串 4.1 串的基本概念 4.2 串存储和实现 4.3 串的匹配算法 4.4 串操作应⽤举例第四章串4.1 串的基本概念 4.2 串存储和实现 4.3 串的匹配算法 4.4 串操作应⽤举例4. 1 串类型的定义⼀、串的定义1 什么是串串是⼀种特殊的线性表,它是由零个或多个字符组成的有,a2, a3, ... a n’限序列,⼀般记作s = ‘a1其中 s----串名, a1,a2, a3, ... a n----串值串的应⽤⾮常⼴泛,许多⾼级语⾔中都把串作为基本数据类型。
在事务处理程序中,顾客的姓名、地址;货物的名称、产地。
可作为字符串处理,⽂本⽂件中的每⼀⾏字符等也可作为字符串处理。
下⾯是⼀些串的例⼦:(1)a = ‘ LIMING’(2)b = ‘NANJING UNIVERSITY OF SCIENCE &TECHNOLOGY’(3)c = ‘ DATA STRUCTURE’(4)d = ‘’说明:1) 串中包含的字符个数,称为串的长度。
长度为0的串称为空串,它不包括任何字符,上⾯(4)中的串d 是空串,(5)中的e 是包含⼀个空格符的空格串;2)串中所包含的字符可以是字母、数字或其他字符,这依赖于具体计算机所允许的字符集。
2 串的有关术语1)⼦串串中任意连续的字符组成的⼦序列称为该串的⼦串例:c = ‘ DATA STRUCTURE’,f=‘DATA’ f是c的⼦串2)⼦串的位置⼦串T 在主串S中的位置是指主串S中第⼀个与T相同的⼦串的⾸字母在主串中的位置。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4.1 串的类型定义
子串的序号:将子串在主串中首次出现时的该 子串的首字符对应在主串中的序号,称为子串 在主串中的序号(或位置)。 【例】 A=“abcdefbbcd”,B=“bcd”,B在A中的 序号为2。 特别地,空串是任意串的子串,任意串是其自 身的子串。
4.1.2 串的抽象数据类型定义
//查找ab子串
if (p->data==‘ a’ && p->next->data==‘b’)
{ p->data=‘x’; p->next->data=‘z’;
q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data=‘y’;
q->next=p->next; p->next=q;
s: a a a a b c d
t: a ab bac acb bc c ✓ 匹配成功 算法的思路是从s的每一个字符开始依次与t的 字符进行匹配。
4.2.1 Brute-Force算法
int BFIndex(SqString s,SqString t)
{ int i=0, j=0,k;
while (i<s.length && j<t.length)
4.1 串的类型定义 4.2 串的表示和实现 4.3 串的模式匹配算法
本章要求
理解: 1、串的基本概念、类型定义 2、串的存储表示和实现 3、串的KMP算法
掌握: 4、串的简单模式匹配算法(BF)
第4章 串的基本概念
串(或字符串):是由零个或多个字符组成 的有限序列。
串的逻辑表示: S=“a1a2…ai…an”,其中S为 串名,ai (1≤i≤n)代表单个字符,可以是字母、 数字或其它字符(包括空白符)。 串值:双引号括起来的字符序列。双引号不是 串的内容,只起标识作用。
串抽象数据类型=逻辑结构+基本运算 ADT String{
数据对象: D ={ ai|ai∈ElemSet, i=1,2,…,n,n≥0 } 数据关系: R ={<ai-1, ai>|ai-1,ai∈D, i=2,4,…,n }
4.1.2 串的抽象数据类型定义
基本操作:
StrAssign(&s,cstr):将字符串常量cstr赋给串s,即生成其值等 于cstr的串s。 StrCopy(&s,t):串复制。将串t赋给串s。 StrEqual(s,t):判串相等。若两个串s与t相等则返回真;否则返 回假。 StrLength(s):求串长。返回串s中字符个数。 DelStr(s,i,j):删除。从串s中删去从第i(1≤i≤n)个字符开 始的长度为j的子串,并返回产生的新串。 StrInsert(s1,i,s2):插入。在串s1第i个位置插入字符串s2,并返回 新串。
4.1.2 串的抽象数据类型定义
RepStr(s,i,j,t):替换。在串s中,将第i(1≤i≤n)个字符开 始的j个字符构成的子串用串t替换,并返回产生的新串。 DispStr(s):串输出。输出串s的所有元素值。 Concat(s,t):串连接:返回由两个串s和t连接在一起形成的新串 。 SubStr(s,i,j,sub):求子串。返回串s中从第i(1≤i≤n)个字 符开始的、由连续j个字符组成的子串,由sub返回。
} ADT Stack
4.1.3 串的存储表示和实现
串的存储方式取决于将要对串所进行的操作。 在计算机中有3种表示方式:
静态顺序存储表示:将串定义成字符数组, 利用串名可以直接访问串值。用这种表示方式, 串的存储空间在编译时确定,其大小不能改变。
4.1.3 串的存储表示和实现
动态顺序存储方式:仍然用一组地址连续的存 储单元来依次存储串中的字符序列,但串的存 储空间是在程序运行时根据串的实际长度动态 分配的。
} StringType ;
4.1.4 串的静态顺序存储表示
(1) 串的联结操作
StringType StrConcat ( StringType s, StringType t){ /* 将串t联结到串s之后,结果仍然保存在s中 */ int i; if ((s.length+t.length)>MaxSize) return 0; /* 联结后长度超出范围 */ /*strcat(s.str,t.str);*/ for (i=0 ; i<t.length ; i++) s.str[s.length+i]=t.str[i] ; /* 串t联结到串s之后 */ s.length=s.length+t.length ; /* 修改联结后的串长度 */ return s;}
T->length=s1->length+s2->length +1; 为最后的\0预留位置
if ((T->ch=(char *)malloc(sizeof((char)* T->length))==NULL)) { printf(“系统空间不够,申请空间失败 !\n”) ;
return 0 ; }
为模式匹配或串匹配(字符串匹配) 。
目标串s 是子串吗?
模式串t
模式匹配
成功是指在目标串s中找到一个模式串t,t是s
的子串,返回t在s中的位置。
不成功则指目标串s中不存在模式串t,t不是s
的子串,返回-1。
4.2.1 Brute-Force算法
Brute-Force简称为BF算法,亦称简单匹配算法。 采用穷举的思路。
查找:p->data=‘a’ && p->next->data=‘b’ p
…
a
b
…
4.1.6 串的链式存储表示
替换
s
p
…
xa
bz
…
qy
s
…x
y
zLeabharlann …4.1.6 串的链式存储表示
void Repl(LinkStrNode *s){ LinkStrNode *p=s->next,*q;
int find=0; while (p->next!=NULL && find==0){
if (s.data[i]==t.data[j])
//继续匹配下一个字符
{ i++;
j++;} //主串和子串依次匹配下一个字符
else //主串、子串指针回溯重新开始下一次匹配
{ i=k+1; //主串从下一个位置开始匹配
j=0; flag=0;
} //子串从头开始匹配
}
if (j>=t.length) return(k); //返回匹配的第一个字符的下标
若每个结点仅存放一个字符,则结点的指针域 就非常多,造成系统空间浪费。
为节省存储空间,考虑串结构的特殊性,使每 个结点存放若干个字符,这种结构称为块链结构。
4.1.6 串的链式存储表示
串的块链式存储的类型定义包括:
LiSi
Boy
…
结点大小为4的链串
#define MaxSize 4
typedef struct StrNode
{ char data[MaxSize] ;
struct StrNode *next;
}LinkStrNode ;
18 ∧
4.1.6 串的链式存储表示
串的块链式存储的类型定义包括:
s
A
B
…
Z∧
结点大小为1的链串
typedef struct StrNode
{
char data ;
struct StrNode *next;
free(s1->ch) ; free(s2->ch) ; return 1; }
4.1.6 串的链式存储表示
串的链式存储结构和线性表的串的链式存储结 构类似,采用单链表来存储串:
data域:存放字符,data域可存放的字符个数称 为结点的大小; next域:存放指向下一结点的指针。
4.1.6 串的链式存储表示
find=1;
} else p=p->next;
}}
作业
设计如下算法:char* StrRelace(char T[], char P[], char S[]),将T中第一次出现的与P相等的 子串替换为S(串S和P的长度不一定相等),并 分析时间复杂度。
4.2 串的模式匹配
模式匹配(模范匹配):子串在主串中的定位称
串的长度(或串长):串中所含字符的个数, 含零个字符的串称为空串。
第4章 串的基本概念
串相等: 当且仅当两个串的长度相等并且各个对应位 置上的字符都相同时,这两个串才是相等的。 【例】:“abcd” ≠ “abc”
“abcd” ≠ “abce” 注:所有空串是相等的。
第4章 串的基本概念
子串:一个串中任意个连续字符组成的子序 列(含空串)称为该串的子串。 【例】 “abcde”的子串有: “”、“a”、“ab” 、“abc”、“abcd” 和“abcde”等
}LinkStrNode ;
4.1.6 串的链式存储表示
【单选题】用带头结点的单链表来表示串s,则串s 为空串的条件是( ) A.s->next==NULL B.s==NULL C.s->next==s D.s->next->next==NULL
4.1.6 串的链式存储表示
【例】在链串中,设计一个算法把最先出现的 子串“ab”改为“xyz”。
}
4.1.4 串的静态顺序存储表示
练习1
设计顺序串上实现串比较运算Strcmp(s,t)的算法