第4章 串

合集下载

严蔚敏数据结构-第四章 串

严蔚敏数据结构-第四章 串
S1 4 a b c d S2 2 e f T 6 a b c d e f
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的子串

第四章串A

第四章串A

(1)初始化ClearString(S):初始化串S(串S存 在,将S清为空串)。 (2)StrAssign(&T,char):生成串。
(3)StrCopy(&T,S):串复制(将串S复制到串T)。5
第4 章 串
(4)Concat(&T,s1,s2):串联接(用T返回S1,S2 联接而成的新串)。 (5)求串长StrLength(S):返回S串的元素个数, 即S串的长度。 (6)串比较StrCompare(S,T) (7)求子串SubString(&Sub,S,pos,len): 返回s串的第pos个字符起始的长度为len的子串。 (8)插入运算SetInsert(&S,T,pos):把串t的 值插入到串s的第pos个字符之后。 (9)删除运算StrDelte(&S,pos,len):将串s
可能出现如下三种情况: a. S1长度+S2长度<=T长度,则S1+S2可以完整放入T中; b. S1长度+S2长度>T长度,则S1完整放入,S2放入一部 分; c. S1长度=T长度,则S1完整放入,S2不能放入。 注意:各串长度数据放入该串的 0 单中。(如图4.1示)
11
第4 章 串
两串联结的C语言程序 (算法4.2)
{ int i; orderstribg *r ;
printf(“ r1=%s,r2=%s\n”,r1.vec,r2.vec);
if (r1.len+r2.len>m0) printf(“上溢出\n”) ; /* 若两串长度之和大于m0,则进行溢出处理*/
12
第4 章 串
else { for (i=0; i<r1.len; i++) r.vec[i]=r1.vec[i]; for (i=0; i<r2.len;i++) /*将串r2传r */ r.vec[r1.len+ i ]= r2.vec[i]; r.vec[r1.len+ i ]=“\0” ; /*最后一个位置赋给\0 */ r.len=r1.len+r2.len; } return(r); } /*r串长度等于两串长度之和*/ /*将串r1传给r */

第4章 字符串v

第4章 字符串v

空串: 空串: 长度为0的字符串 的字符串; 长度为 的字符串; 空格串: 空格串: 由空格字符组成的字符串,长度>1 由空格字符组成的字符串,长度 主串: 主串: 包含该子串的字符串; 包含该子串的字符串; 字符的位置: 字符的位置: 从1开始 开始 子串的位置: 子串的位置: 该子串第一个字符的位置
定长顺序存储标识串的实际长度时可有三种方式: 定长顺序存储标识串的实际长度时可有三种方式:
(1)用一个指针指向最后一个字符,串描述类似顺序表 用一个指针指向最后一个字符, 用一个指针指向最后一个字符 #define MAXSIZE 256 typedef struct { char data[MAXSIZE]; int curlen; }SeqString; 定义一个串变量:SeqString s; 定义一个串变量
1.串的 定长 顺序存储 串的(定长 串的 定长)顺序存储
(定长 顺序存储结构类似于C语言的字符数组,以一 定长)顺序存储结构类似于 语言的字符数组, 定长 顺序存储结构类似于 语言的字符数组 组地址连续的存储单元存放串值中的字符序列, 组地址连续的存储单元存放串值中的字符序列,定长即是预 先为每一个串变量分配一个固定长度的存储区,例如: 先为每一个串变量分配一个固定长度的存储区,例如: #define MAXSIZE 256 char s[MAXSIZE] 那么,串的最大长度就不能超过 那么,串的最大长度就不能超过256。 。
第4章 串 章
4.1 字符串的基本概念
4. 2 串的存储结构
4.3 模式匹配
(1) 串的基本概念
串(string)是由零个或多个任意字符组成的字符序列, )是由零个或多个任意字符组成的字符序列, 又称为字符串( 又称为字符串(character string),一般记为: ) 一般记为: s=〝a1 a2 a3 … an〞

第四章 串图文

第四章 串图文

在上述串的抽象数据类型定义的13种操作中,串 赋值StrAssign、串复制Strcopy、串比较 StrCompare、求串长StrLength、串联接Concat以 及求子串SubString等六种操作构成串类型的最小 操作子集。即:这些操作不可能利用其它串操作 来实现,而其它串操作(除串清除ClearString和 串销毁DestroyString外)如定位函数Index( S, T, pos )可在这个最小操作子集上实现如p72。
例如:C语言函数库中提供下列串处理函数:
gets(str) 输入一个串; puts(str) 输出一个串; strcat(str1, str2) 串联接函数; strcpy(str1, str2, k) 串复制函数; strcmp(str1, str2) 串比较函数; strlen(str) 求串长函数;
子串的定位
Replace (&S, T, V) 串的置换 StrInsert (&S, pos, T) 串的插入
StrDelete (&S, pos, len) 串的删除
} ADT String
StrAssign (&T, chars)
(串的赋值)
初始条件:chars 是字符串常量。
操作结果:把 chars中的字符串 常量 赋给 T。
StrDelete (&S, pos, len)
初始条件:串S存在
1≤pos≤StrLength(S)-len+1。
操作结果:从串S中删除第pos个字符 起长度为len的子串。
ClearString (&S)
初始条件:串S存在。 操作结果:将S清为空串。
串的基本操作集可以有不同的定义方法, 在使用高级程序设计语言中的串类型时,以该 种语言的参考手册为准。

第4章 串

第4章 串
12
4.2.1 定长顺序存储表示 串的连接算法
第4章 串
Status Concat(SString S1, SString S2, SString &T) { // 用T返回由S1和S2联接而成的新串。若未截断, 则返回TRUE,否则FALSE。 ………………. else if (S1[0] <MAXSTRSIZE) { // 截断 T[1..S1[0]] = S1[1..S1[0]]; T[S1[0]+1…MAXSTRLEN] = S2[1…MAXSTRLEN-S1[0]]; T[0] = MAXSTRLEN; uncut = FALSE; }
第4章 串
字符串本身就是一个线性表,可以用链表存储。 如果每个结点存储一个字符,如采用32位地
址,字符按8位记,则存储密度是多少?
存储密度 = 数据元素所占存储位 实际分配的存储位 8 =20% 40
21
存储密度 =
4.2.3 串的块链存储表示 链表存储字符串的讨论
第4章 串
结论:采用普通链表存储字符串,存储密度非常 低,浪费空间严重。 解决办法:一个结点存储多个字符。这就是串的 块链存储。
5
4.1 串类型的定义 串与一般线性表的区别
第4章 串
(1) 串数据对象约束为字符集。
(2) 基本操作的对象不同,线性表以“单个元素”
为操作对象;串以“串的整体”为操作对象,操作的 一般都是子串。
6
4.1 串类型的定义 串的ADT定义 ADT String {
第4章 串
数据对象:D={ ai |ai∈CharacterSet,i=1,2,...,n, n≥0 } 数据关系: R1={ < ai-1, ai > | ai-1, ai ∈D, i=2,...,n } 基本操作: } ADT String

串
初始条件:串S和T存在。 操作结果:若S>T,则返回值>0;若S = T,则返回值=0;若S<T,则返回值<0.
ClearString (&S)
初始条件:串S存在。 操作结果:将S清为空串。
Concat (&T , S1, S2)
初始条件:串S1和S2存在。 操作结果:用T返回由S1和S2联接而成的新串。
Status ClearString(HString &S) { //将S清为空串. if(S.ch) { free(S.ch); S.ch=NULL;} S.length=0; return OK; }// ClearString
Status Concat(HString &T, HString S1, HString S2)
int Strlength(HString S) { return S.length; }
int StrCompare(HString S, HString T) { //若S>T,则返回值>0;若S = T,则返回值=0;若S<T,则返回值<0 for( 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; }
• 二、串的抽象数据类型的定义
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)

第四章 串

第四章 串
主串S首次出现的位置;否则返回0
– 例如
• 主串S = • 子串T = CD • 则index(S,T),返回子串T在S中,第一次出现的位置3
19
串的模式匹配
Brute-Force算法基本思想: • 从目标串s 的第一个字符起和模式串t的第一个字符进行比较 • 若相等,则继续逐个比较后续字符,否则从串s 的第二个字 符起再重新和串t进行比较。 • 依此类推,直至串t 中的每个字符依次和串s的一个连续的字 符序列相等,则称模式匹配成功,此时串t的第一个字符在串s 中的位置就是t 在s中的位置,否则模式匹配不成功。
两式联立可得:“T0…Tk-1”= “Tj-k…Tj-1”
注意:j为当前已知的失配位置,我们的目标是计算新起点k。式中仅剩 一个未知数k,理论上已可解!
奇妙的结果:k仅与模式串T有关!
27
新起点k怎么求?
根据模式串T的规律:“T0…Tk-1”=“Tj-k …Tj-1” 由当前失配位置j(已知),归纳计算新起点k的表达式。
j=next[j]的位置(即模式串继续向右移动),再比较 si 和 tj 。
依次类推,直到下列两种情况之一: 1)j退回到某个j=next[j]时有 si = tj,则指针各增1,继续匹配; 2)j退回至j=0,此时令指针各增1,即下一次比较 si+1和 t0 。
30
串的模式匹配:KMP算法
• 模式串的next函数
6
串的基本概念
4.两个字符串相等的充分必要条件为两个字符串的长度相等,并 且对应位置上的字符相等。
例如:‘abcd’ ≠ ‘bacd’ ‘abcd’ = ‘abcd’
7
串的基本操作
1.给串变量赋值 ASSIGN(S1,S2)

第4章 串

第4章   串

第4章串4.1选择题1.下面关于串的的叙述中,哪一个是不正确的?()A)串是字符的有限序列B)空串是由空格构成的串C)模式匹配是串的一种重要运算D)串既可以采用顺序存储,也可以采用链式存储【答案】B【解析】空串是不含任何字符的串,即空串的长度是零。

空格串是由空格组成的串,其长度等于空格的个数。

2.设有两个串p和q,其中q是p的子串,求q在p中首次出现的位置的算法称为()A)求子串B)联接C)匹配D)求串长【答案】C3.若串s="software",其子串个数是()A)8 B)37 C)36 D)9【答案】C【解析】s的长度为8,长度为8的子串有1个,长度为7的子串有2个,长度为6的子串有3个,长度为5的子串有4个,…,长度为1的子串有8个,共有(1+8)*8/2=36个。

4.串的长度是指()A)串中所含不同字母的个数B)串中所含字符的个数C)串中所含不同字符的个数D)串中所含非空格字符的个数【答案】B5.若串S1="ABCDEFG",S2="9898",S3="###",S4="012345",则执行concat(replace(S1,substr(S1,length(S2),length(S3)),S3),substr(S4,index(S2, '8'),length(S2)))其结果为()A)ABC###G0123 B)ABCD###2345C)ABC###G2345 D)ABC###G1234【答案】D【解析】函数concat(x,y)返回x和y的连接串,substr(s,i,j)返回串s的从序号i的字符开始的j个字符组成的子串,length(s)返回串s的长度。

replase(s,t,v)用v替换s中出现的所有与t相等的子串,index(s,t,i)当s中存在与t值相同的子串时,返回它在s中的第i个字符之后第一次出现的位置。

数据结构第四章串

数据结构第四章串

(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相同的子串 为止。

数据结构第四章:串

数据结构第四章:串

例2、串的定位 、串的定位index(s,t,pos)
在主串s中取从第 个字符起、 相等的子串和T比较 在主串 中取从第pos个字符起、长度和串 相等的子串和 比较,若 中取从第 个字符起 长度和串T相等的子串和 比较, 相等,则求得函数值为i,否则值增1直至 中不存在和串T相等的子串 直至S中不存在和串 相等,则求得函数值为 ,否则值增 直至 中不存在和串 相等的子串 为止。 为止。
}
4.2 串的表示和实现
首先强调:串与线性表的运算有所不同,是以“串的整体” 首先强调:串与线性表的运算有所不同,是以“串的整体”作 为操作对象,例如查找某子串, 为操作对象,例如查找某子串,在主串某位置上插入一个子串 等。 串有三种机内表示方法: 串有三种机内表示方法:
定长顺序存储表示
顺序 存储 ——用一组地址连续的存储单元存储串值的字 用一组地址连续的存储单元存储串值的字 符序列, 静态存储方式 方式。 符序列,属静态存储方式。
4.1 串类型的定义 4.2 串的表示和实现
4.1 串的类型定义
4.1.1串的定义
定义:串(string)是由零个或多个任意字符组成的字 符序列,是数据元素为单个字符的特殊线性表。 的特殊线性表。 是数据元素为单个字符的特殊线性表 记为:an”
(n≥0 )
第4章 串(String) 章 )
本章主题:串的各种基本运算及其实现 本章主题: 教学目的:了解数据结构的基本概念, 教学目的:了解数据结构的基本概念,理解常用术语 教学重点: 教学重点: 掌握串的基本概念及其基本运算 掌握串的存储结构 主要内容: 主要内容: 1.串的基本概念 2.串的存储结构 2.串的存储结构 3.串的基本运算及其实现 3.串的基本运算及其实现
串其中0<=pos<=strlen(s)-1,且数组 且数组sub至少可容纳 至少可容纳len+1个字符。*/ 个字符。 串其中 且数组 至少可容纳 个字符

第4章习题答案

第4章习题答案

习题41.名词解释:串、空串、空格串、子串。

解:串是有限的字符序列,从数据结构角度讲,串属于线性结构。

与线性表的不同之处在于串的元素是字符。

空串是不含任何字符的串,其长度为0。

空格是一个字符,其ASCII 码值是32。

空格串是由空格组成的串,其长度等于空格的个数。

串中任意连续的若干字符组成的子序列称为该串的子串。

2.已知三个字符串分别为”“a abcaabcbca ab S =,”“caab S =',”“bcb S ="。

利用串的基本运算得到结果串为”“a aca caabcbca S ='",要求写出得到结果串3S 所用的函数及执行算法。

解:串'"S 可看作由以下两部分组成:”“a caabcbca 和”“a ca ,设这两部分分别叫串s1和s2,要设法从S 、'S 、"S 中得到这两部分,然后使用连接操作连接s1和s2得到'"S 。

i=index();//s1=substr(S ,i,length(S )-i+1);//取出串s1j=index(S ,"S );//求串"S 在串S 中的起始位置,S 串中”“bcb 后是”“a cas2=substr(S ,j+3,length(S )-j-2);//形成串s2'"S =concat(s1,s2);3.已知字符串1S 中存放一段英文,写出算法),3,2,1(n S S S format ,将其按给定的长度n 格式化成两端对齐的字符串2S ,其多余的字符存入3S 。

解:题目要求将字符串S1拆分成字符串S2和S3,要求字符串S2“按给定长度n 格式化为两端对齐的字符串”,即长度为n 且首尾字符不能为空格字符。

算法从左到右扫描字符串S1,找到第一个非空格字符,计数到n ,第n 个拷入字符串S2的字符不能为空格,然后将余下字符复制到字符串S3中。

第4章 串

第4章 串
沈阳工业大学







(4)串比较(compare) int strcmp(char *s1,char *s2); 该函数比较串s1和串s2的大小,当返回值小于0,等于0 或大于0时分别表示s1<s2、s1=s2或s1>s2 例如:result=strcmp(“baker”,”Baker”) result>0 result=strcmp(“12”,”12”); result=0 result=strcmp(“Joe”,”Joseph”); result<0 (5)字符定位(index) char strchr(char *s,char c); 该函数是找字符c在字符串中第一次出现的位置,若找到 则返回该位置,否则返回NULL。 例如:p=strchr(s2,’.’); p 指向“file”之后的位置 s2=“file.cpp”
}
沈阳工业大学







2堆分配存储表示
这种存储表示的特点是,仍以一组地址连续的存储单元 存放串值字符序列,但它们的存储空间是在程序执行过程中 动态分配而得。所以也称为动态存储分配的顺序表。在C语 言中,利用动态存储管理函数,来根据实际需要动态分配和 释放字符数组空间。 typedef char *string; //c中的串库相当于此类型定义
沈阳工业大学







串中任意个连续字符组成的子序列称为该串的子串 ,包含子串的串相应地称为主串。通常将子串在主串中 首次出现时的该子串的首字符对应的主串中的序号,定 义为子串在主串中的序号(或位置)。例如,设A和B分 别为 A=“This is a string” B=“is” 则B是A的子串,A为主串。B在A中出现了两次,其中首 次出现所对应的主串位置是3。因此,称B在A中的序号 (或位置)为3。 特别地,空串是任意串的子串,任意串是其自身的 子串。 通常在程序中使用的串可分为两种:串变量和串常 量。

数据结构4_串

数据结构4_串
注: • 一般用SString[0]来存放串长信息(如pascal语言);
• C语言约定在串尾加结束符 ‘ \0’,以利操作加速,但不计入串 长
• 若字符串超过Maxstrlen 则自动截断(因为静态数组存不 进 去)。
2020/4/26
13
例:用顺序存储方式编写求子串函数SubString(&Sub,S,pos,len)
if (T.ch) free(T.ch); //释放T原有空间
C是指针变量,可以自增! 意即每次后移一个数据单 元。
for (i=0, c=chars; *c; ++i, ++c); //求chars的串长度i
if ( !i ) {T.ch = NULL; T.length = 0;}
直到终值为“假”
}
改用动态分配的一维数组——堆
2020/4/26
14
堆分配存储特点:仍用一组连续的存储单元来存放串,但存
储空间是在程序执行过程中动态分配而得。
思路:利用malloc函数合理预设串长空间。
特点: 若在操作中串值改变,还可以利用realloc函数按新串长
度增加空间(即动态数组概念) 。
堆T的存储结构描述:
{ if(pos<1 || pos>S[0] || len<0 || len>S[0]-pos+1) return ERROR;
//若pos和len参数越界,则告警
Sub[1……len]=S[pos……pos+len-1];
子串长度
Sub[0]=len; return OK;
讨论:想存放超长字符串怎么办?
用定长的字符数组来定义,数组的上界预先给出,故称为静态存 储分配。

第4章《串》

第4章《串》

第四章《串》一、选择题1.下面关于串的的叙述中,哪一个是不正确的?()【北方交通大学2001 一、5(2分)】A.串是字符的有限序列B.空串是由空格构成的串C.模式匹配是串的一种重要运算D.串既可以采用顺序存储,也可以采用链式存储【参考答案】B2 若串S1=‘ABCDEFG’, S2=‘9898’ ,S3=‘###’,S4=‘012345’,执行concat(replace(S1,substr(S1,length(S2),length(S3)),S3),substr(S4,index(S2,‘8’),length(S2))) 其结果为()【北方交通大学1999 一、5 (25/7分)】A.AB C###G0123 B.ABCD###2345 C.ABC###G2345 D.ABC###2345E.ABC###G1234 F.ABCD###1234 G.ABC###01234【参考答案】E3.设有两个串p和q,其中q是p的子串,求q在p中首次出现的位置的算法称为()【北京邮电大学2000 二、4(20/8分)】【西安电子科技大学1996 一、1 (2分)】A.求子串B.联接C.匹配D.求串长【参考答案】C4.已知串S=‘aaab’,其Next数组值为()。

【西安电子科技大学1996 一、7 (2分)】A.0123 B.1123 C.1231 D.1211【参考答案】A5.串‘ababaaababaa’的next数组为()。

【中山大学1999 一、7】A.012345678999 B.012121111212 C.011234223456 D.0123012322345【参考答案】C6.字符串‘ababaabab’ 的nextval 为()【北京邮电大学1999 一、1(2分)】A.(0,1,0,1,04,1,0,1)B.(0,1,0,1,0,2,1,0,1)C.(0,1,0,1,0,0,0,1,1)D.(0,1,0,1,0,1,0,1,1)【参考答案】A7.模式串t=‘abcaabbcabcaabdab’,该模式串的next数组的值为(),nextval数组的值为()。

第4章 串

第4章 串


串:是一种受限制的线性表,数据元素有字符组成 4.1 串的基本概念 定义:表示形式:S="a1,a2,a3,….an"(n>=0); 定义:表示形式:S="a1,a2,a3,….an"(n>=0) n是串的长度,当N=0时,长度为0,表示空串, 是串的长度,当N=0时,长度为0 仅有一个或多个空格组成的串称为空白串,注意:空白串不等于空串 子串:串中由任意连续的字符组成的子序列称为该串的子串, 主串:包含子串的串称为主串 位置:字符在序列中的序号称为该字符在串中的位置 ,子串的首字符在主串中的序号称为子串在主串 中的位置 相等:若2个串中的对应位置的字符都相同,串的长度也相等,则2 相等:若2个串中的对应位置的字符都相同,串的长度也相等,则2个串都相等 ,如果两个串不相等 时,按他们的ASCII码区分大小 时,按他们的ASCII码区分大小 模式匹配:在S中寻找与T 模式匹配:在S中寻找与T相同的子串的过程, S称为正文,T称为模式,如果找到称为匹配成功,否 称为正文,T 则为匹配失败 基本操作: 1,串赋值 strassigh(s,t) 将一个串值t赋给串s 将一个串值t赋给串s 2,求串长度strlength(s) ,求串长度strlength(s) 求串s 求串s的长度 3,串比较strcmp(s1,s2) ,串比较strcmp(s1,s2) 如果相等,返回值0,如果s1>s2,返回值为1,如果s1<s2,则返回如果相等,返回值0,如果s1>s2,返回值为1,如果s1<s2,则返回-1 4,串复制strcopy(s,t) ,串复制strcopy(s,t) 将一个串t复制给串s 将一个串t复制给串s中 5,串连接strconcat(s1,s2) ,串连接strconcat(s1,s2) 在s1后边连接s2的串值,并返回连接够的结果 s1后边连接s2的串值,并返回连接够的结果 6,求子串substr(s,I,k) ,求子串substr(s,I,k)

数据结构课件 第四章 串和数组

数据结构课件 第四章 串和数组

else {
s->str=(char*)malloc((len+1)*sizeof(char));
//分配空间
if (!s->str) return ERROR;
s->str[0..len]=string_constant[0..len];
//对应的字符赋值
s->length=len;
//赋予字符串长度
串的抽象数据类型定义
functions:
// 有13种之多
StrAssign(&T, chars) // 串赋值,生成值为chars的串T
StrCompare(S,T)
// 串比较,若S>T,返回值大于0…
StrLength(S)
// 求串长,即返回S的元素个数
Concat(&T, S1, S2) // 串连接,用T返回S1+S2的新串
type unsigned char String[MAX_STRING];
第二种是在程序执行过程中,利用标准函数malloc和free动态
地分配或释放存储字符串的存储单元,并以一个特殊的字符作为字符串
的结束标志,它的好处在于:可以根据具体情况,灵活地申请适当数目
的存储空间,从而提高存储资源的利用率。类型定义如下所示:
(4)串连接 int Concat(STRING *s1,STRING s2) { STRING s; StringAssign(&s,s1->str); //将s1原来的内容保留在s中 len=Length(s1)+Length(s2); //计算s1和s2的长度之和 free(s1->str); //释放s1原来占据的空间 s1->str=(char*)malloc((len+1)*sizeof(char)); //重新为s1分配空间

第4章 串

第4章 串

表类似,对连接操作方便。
head head A B C E F GH I ∧ I # # #∧
AB CD
中 国 石 油 大 学
4.2
串的链式存储方式的描述
#define CHUNKSIZE 80 typedef struct Chunk {
串的表示和实现
//可由用户定义的块大小 //首先定义结点类型
中 国 石 油 大 学
4.1
串类型的定义
例:求串的定位Index(S,T,pos)。 基本思想:在主串S中取从第i(i的初值为pos)个字符起、 长度和串T相等的子串和串T比较,若相等,则求得函数值
为i,否则i值增1至串S中不存在和串T相等的子串为止。
i
S串
pos
T串
n-m+1
T串
中 国 石 油 大 学
4.1
串类型的定义
例:串的定位Index(S,T,pos) int Index(String S,String T,int pos){
// T为非空串。若主串S中第pos个字符之后存在与 T相等的子串, // 则返回第一个这样的子串在S中的 位置,否则返回0
if(pos>0){ n=Strlength(S); m=Strlength(T); i=pos; while(i<=n-m+1){ Substring(sub,S,i,m); if(StrCompare(sub,T)!=0) ++i;
体”作为操作对象。
中 国 石 油 大 学
4.1
二、串的基本操作
串类型的定义
串赋值 StrAssign (&T, chars);把 chars 赋为 T 的值。

数据结构 第四章 串

数据结构 第四章 串

第四章串串又称字符串,是一种特殊的线性表,它的每个元素仅由一个字符组成。

计算机上非数值处理的对象基本上是字符串数据。

在较早的程序设计语言中,字符串仅作为输入和输出的常量出现。

随着计算机应用的发展,在越来越多的程序设计语言中,字符串也可作为一种变量类型出现,并产生了一系列字符串的操作。

在信息检索系统、文字编辑程序、自然语言翻译系统等等应用中,都是以字符串数据作为处理对象的。

本章将讨论串的存储结构和基本操作。

4.1 串的基本概念4.1.1 串的自然语言定义串(string)(或字符串)是由零个或多个字符组成的有限序列,一般记为:S="a1 a2 …… a n" (n≥0)其中,S是串名,用双引号括起来的字符串序列是串的值;a i(1≤i≤n)可以是字母、数字或其他字符;串中字符的个数n称为串的长度。

长度为0的串称为空串。

需要注意的是,串值必须用一对双引号括起来,但双引号本身不属于串,它的作用只是为了避免与变量名或数的常量混淆。

如"tempt"是个串,tempt则是变量名;"23"是串,而23则是一个常量.串中任意个连续的字符组成的子序列称为该串的子串,如:串S="This is a string",其中"This"是一个子串,"string"也是一个子串。

求子串在串中的起始位置称为子串定位或模式匹配。

例如,设A,B,C为如下三个串:A="data",B="structure",C="data structure",则它们的长度分别是4,9,14,A和B都是C的子串,A在C中的位置是1,而B在C中的位置是6。

下面注意区别空格串与空串的概念。

在各种应用中,空格常常是串的字符集合中的一个元素,因而可以出现在其他字符中间。

由一个或多个空格组成的串称为空格串,也就是说空格串中只有空格字符,空格串的长度不为零。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

4
4.1.1 串的基本概念
是零个或多个字符组成的有限序列。 串(String)是零个或多个字符组成的有限序列。 是零个或多个字符组成的有限序列 一般记为: 一般记为: S="a1…an" (n≥0) 其中S是串的名字 是串的名字, 其中 是串的名字,用双引号括起来的字符序 列是串的值, 可以是字母、 列是串的值,ai(1≤i≤n)可以是字母、数字或其 可以是字母 他字符。 他字符。 请注意空串(Null String)和空格串 和空格串(Blank 请注意空串 和空格串 String)的区别。 的区别。 的区别 串中任意个连续的字符组成的子序列称为该串 的子串。包含子串的串相应的称为主串。 的子串。包含子串的串相应的称为主串。
8
4.2.1 串的顺序存储结构
串的顺序存储就是把串所包含的字符序列依次 存入连续的存储单元中去, 存入连续的存储单元中去,也就是用向量来存 储串。串的顺序存储结构如图4.1所示 所示。 储串。串的顺序存储结构如图 所示。 定长顺序串的存储结构使用C语言描述如下: 定长顺序串的存储结构使用 语言描述如下: 语言描述如下
5
4.1.2 串的基本操作
下面给出串的基本操作。 下面给出串的基本操作。
(1) StrAssign(S,chars):串赋值操作。将字符串chars的值赋值给 串S。 (2) StrLength(S):串长度操作。返回串S的长度,即串S中的元素 个数。 (3) StrInsert(S,T,pos):串插入操作。如果1≤pos≤StrLength(S)+1 时,在串S的第pos个字符之前插入串T。 (4) StrDelete(S,pos,len):串删除操作。如果 1≤pos≤StrLength(S)-len+1,则从串S中删除第pos个字符起长度为len 的子串。 (5) StrCopy(S,T):串复制操作。将串T复制到串S中。 (6) StrEmpty(S):串判空操作。若串S为空串,则返回1;否则返 回0。 (7) StrCompare(S,T):串比较操作。若串S与T相等则返回1;否 则返回0。 (8) StrClear(S):串清空操作。将串S清为空串。 (9) StrConcat(S,T):串连接操作。将串T连接在串S的后面。
13
4.2.3 串的块链式存储结构
每个结点称为一个块,整个链表称为块链结构, 每个结点称为一个块,整个链表称为块链结构, 为了便于操作,再增加一个尾指针。 为了便于操作,再增加一个尾指针。结点大小 为数据域中存放字符的个数。 为数据域中存放字符的个数。 例如, 是结点大小为4(即每个结点存放 例如,图4.3(a)是结点大小为 即每个结点存放 是结点大小为 4个字符 的链表,图4.3(b)是结点大小为 的链 个字符)的链表 是结点大小为1的链 个字符 的链表, 是结点大小为 表。
typedef struct { char *ch; int len; }HString;
11
4.2.2 串的堆式存储
由于这种类型的串变量的串值的存储位置是在 程序执行过程中动态分配的, 程序执行过程中动态分配的,与定长顺序串和 链串相比,这种存储方式是非常有效和方便的, 链串相比,这种存储方式是非常有效和方便的, 但在程序执行过程中会不断生成新串和销毁旧 串。
10
4.2.2 串的堆式存储
系统将一个地址连续、 系统将一个地址连续、容量很大的存储空间作为字符 串的可用空间,每当建立一个新串时, 串的可用空间,每当建立一个新串时,系统就从这个 空间中分配一个大小和字符串长度相同的空间存储新 串的串值。 串的串值。 语言中, 的自由存储空间, 在C语言中,已经有一个称为“堆”的自由存储空间, 语言中 已经有一个称为“ 并可用malloc()和free()函数完成动态存储管理。因此, 函数完成动态存储管理。 并可用 和 函数完成动态存储管理 因此, 我们可以直接利用C语言中的 语言中的“ 实现堆串。此时, 我们可以直接利用 语言中的“堆”实现堆串。此时, 堆串可定义如下: 堆串可定义如下:
15
本章小结
(1) 串是一种数据类型受到限制的特殊线性表,它的 串是一种数据类型受到限制的特殊线性表, 数据对象是字符集合,每个元素都是一个字符, 数据对象是字符集合,每个元素都是一个字符,一系 列相连的字符组成一个串。 列相连的字符组成一个串。 (2) 串虽然是线性表,但又有其自己的特点:不是作 串虽然是线性表,但又有其自己的特点: 为单个字符进行讨论,而是作为一个整体(即字符串 即字符串) 为单个字符进行讨论,而是作为一个整体 即字符串 进行讨论。 进行讨论。 (3) 串的存储方式也有顺序存储结构和链式存储结构, 串的存储方式也有顺序存储结构和链式存储结构, 其中顺序存储可以是静态存储也可以是动态存储, 其中顺序存储可以是静态存储也可以是动态存储,定 长顺序存储结构是静态存储, 长顺序存储结构是静态存储,堆式存储结构是动态存 储。 (4) 串的基本运算有串连接、两串相等判断、取子串、 串的基本运算有串连接、两串相等判断、取子串、 插入子串、删除子串、子串定位和串置换等。 插入子串、删除子串、子串定位和串置换等。
7
4.2 串的存储结构
线性表的顺序和链式存储结构对于串都是适用 的。但任何一种存储结构对于串的不同运算并 非都是十分有效的。 非都是十分有效的。 对于串的插入和删除操作, 对于串的插入和删除操作,顺序存储结构是不 方便的,而链式存储结构则显得方便些。 方便的,而链式存储结构则显得方便些。如果 访问串中单个字符,对链表来说是不困难的; 访问串中单个字符,对链表来说是不困难的; 当要访问一组连续的字符时,用链式存储结构 当要访问一组连续的字符时, 要比用顺序存储结构麻烦。 要比用顺序存储结构麻烦。
1. 串赋值操作 2. 串插入操作 3. 删除子串函数 4. 串连接函数
12
4.2.2 串的堆式存储
下面给出调用上述各基本操作的主函数。 下面给出调用上述各基本操作的主函数。 main() { HString s1={"Beijing ",8},s2={"China",5},s3={0,0},s4={0,0}; char *chars="Heilongjiang"; StrConcat(&s1,s2); /*调用StrConcat函 数 */ printf("\n%s\n%d",s1.ch,s1.len); StrInsert(&s3,s2,1); /*调用StrInsert 函数 */ printf("\n%s\n",s3.ch); StrDelete(&s1,9,5); /*调用StrDelete 函数 */ printf("\n%s\n",s1.ch); StrAssign(&s4,chars); /*调用StrAssign函 数 */ printf("\n%s\n",s4.ch); }
#define MAXLEN 100 typedef struct { char ch[MAXLEN]; int len; }SString;
9
4.2.1 串的顺序存储结构
下面是定长顺序串部分基本操作的实现。 下面是定长顺序串部分基本操作的实现。 1. 串连接操作 2. 串比较操作 3. 取子串操作 4. 串插入操作 5. 串删除操作 6. 串置换函数 7. 子串定位操作
6
4.1.2 串的基本操作
(10) SubString(Sub,S,pos,len):求子串操作。若 存在位置1≤pos≤StrLength(S)且 1≤len≤StrLength(S)-pos+1,则用Sub返回串S的 第pos个字符起长度为len的子串。 (11) StrIndex(S,T):串定位操作。若串S中存在 和串T相同的子串,则返回它在串S中第一次出现 的位置;否则返回0。 (12) StrReplace(S,T,pos,len):串替换操作。当 1≤pos≤StrLength(S)且0≤len≤StrLength(S)-pos+1 时,用串T替换串S中从第pos个字符开始的len个 字符。 (13) StrDestroy(S):串销毁操作。销毁串S。
(a) 结点大小为4的链表
(b) 结点大小为1的链表
14
4.3 串 的 应 用
【例4.1】文本编辑。 】文本编辑。 参见教材P81 【例4.2】设有一篇英文短文,每个 】设有一篇英文短文, 单词之间是用空格分开的, 单词之间是用空格分开的,试编写一 算法, 算法,按照空格数统计短文中单词的 个数。 个数。 参见教材P83
Hale Waihona Puke 2第4章 串学习目标与要求: 了解串的基本概念和基本运算。 熟练掌握串的顺序存储结构,掌握 串的堆式存储结构和串的链式存储 结构。 熟练掌握串的顺序存储结构中的连 接、相等判断、取子串、插入、删 除和子串查找等算法的实现。
3
4.1 串的定义及基本操作
串即字符串, 串即字符串,计算机处理的对象分为数值数据 和非数值数据,字符串是最基本的非数值数据。 和非数值数据,字符串是最基本的非数值数据。 字符串的应用非常广泛,它是许多软件系统(如 字符串的应用非常广泛,它是许多软件系统 如 字符编辑、情报检索、词法分析、符号处理、 字符编辑、情报检索、词法分析、符号处理、 自然语言翻译等系统)的操作对象 的操作对象。 自然语言翻译等系统 的操作对象。 在事务处理程序中, 在事务处理程序中,顾客的姓名和地址以及货 物的名称、 物的名称、产地和规格等一般也是作为字符串 处理的。字符串是一种特定的线性表, 处理的。字符串是一种特定的线性表,其特殊 性在于组成线性表的每个元素都是一个单字符。 性在于组成线性表的每个元素都是一个单字符。
16


一、填空题 参见教材P84 二、选择题 三、判断题 四、算法设计题
相关文档
最新文档