4第四章 字符串 (String)
严蔚敏数据结构-第四章 串
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章 字符串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〞
第4章 C++ 标准库STL string类
String的第一个下标为0,最后一个为length-1
5
第4章 String类与字符串流处理
C++标准库中的String类
String的特性 String的构造函数, 求属性函数 String的赋值,连接,比较,子串,交换 String的查找,替换,插入 String到 char *的转换 String迭代器
21
第4章 String类与字符串流处理
C++标准库中的String类
String的特性 String的构造函数, 求属性函数 String的赋值,连接,比较,子串,交换 String的查找,替换,插入 String到 char *的转换 String迭代器
22
String到 char *的转换
I1指向第一个字符
26
符的起始下标, 此刻为0 („c‟ 出现)
s3.find_last_not_of(“spqtw”) –在s3中从0下标开始向后 末次出现 “spqtw”5个字符中任意一个字 符的起始下标, 此刻为5 („a‟ 出现)
19
String的查找,替换,插入
String s1(“cat”), s2(“cap”), s3(“cap cat ”)
s2=s2+ “ is good! ” --- s2: cap is good! s1.append( “ is white”) ---s1: cat is white s3.append(s2, 3, s2.size()) ---s3: pat is good!
13
String的比较
String s1(“cat”), s2(“cap”), s3(“cat cap”) if (s1==s2) cout<<“true”; else cout<<“false”‟ ---false
(个人收集学习笔记)4字符串处理与正则表达式
(个人收集学习笔记)4字符串处理与正则表达式第四章字符串处理与正则表达式一、字符串处理介绍1、如果字符串处理函数和正则表达式都可以实现字符串操作,建议使用字符串处理函数,因为效率高。
2、因为PHP 是弱类型语言,所以其他类型的数据一般都可以直接应用于字符串操作函数里,而自动转换成字符串类型进行处理。
3、还可以将字符串视为数组,或当作字符集合来看待。
$str[0]$str{0}二、常用的字符串输出函数1、echo()函数:使用它的效率要比其他字符串输出函数高。
2、print()函数:功能和echo()一样,但它有返回值,成功返回1,不成功返回0。
3、die()函数:exit()函数的别名。
1)参数如果是字符串,则该函数会在退出前输出它。
2)如果参数是一个整数,这个值会被用做退出状态。
值在0-254之间,退出状态255由PHP 保留,不会使用。
状态0用于成功终止程序。
4、printf():用于输出格式化字符串。
1)例子:printf(“%s age is $d”,$str,$num);2)%d :带符号十进制数%u :无符号十进制数%f :浮点数%s :字符串%b :二进制数%c :依照ASCII 值的字符%%:返回百分比符号%o :八进制数%x :十六进制数(小写字母)%X :十六进制数(大写字母)3)如果%符号多于arg 参数,则必须使用占位符。
占位符被插入到%符号之后,由数字和\$组成。
如:printf(“The %2\$s book contains %1\$d pages.That’s a nice %2\$s full of %1\$d pages”,$num,$str);%2\$s 代表$str 。
5、sprintf()函数:用法和printf()一样,但它不是输出字符串,而是把格式化的字符串以返回值的形式写入到一个变量中。
三、常用的字符串格式化函数字符串的格式化就是将字符串处理为某种特定的格式。
第四章 串
– 例如
• 主串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)
数据结构中的串
StrCompare(S, T) : 若S>T 返回>0;若S=T 返回=0;若
S<T 返回<0;
StrLength( S ) :串S存在,返回S中元素的个数,称为串
的长度
more
串的基本操作
Concat( &T, S1,S2 ) : 用T返回S1和S2联接而成的新串 SubString( &Sub,S,pos,len ) : 用Sub返回串S的第pos个
▪ 两个串之间可以进行比较。 ▪ 称两个串相等,当且仅当这两个串的值相等,包括
两个串的长度相等,并且各个对应位置的字符都相 等。
▪ 当两个串不相等时,可按“字典顺序”分大小。令
s= “s0s1…sm-1” (m>0) t= “t0t1…tn-1” (n>0) ▪ 假设,两者最大有前k个子序列相等(最大相等前缀子
▪ 串中任意个连续的字符组成的子序列称为该串的子串。包含 子串的的串相应地称为主串。通常称字符在序列中的序列号 为该字符在串中的位置。子串在主串中的位置则以子串第0 个字符在主串的位置来表示。
4.1 串的定义和操作
▪ 例如:下面a,b,c,d都是串
▪ a=“BEI”
长度为3
▪ b=“JING”
长度为4
44
第4章 串
字符串string常用方法
字符串string常用方法字符串是编程中常用的数据类型之一,它是由一系列字符组成的序列。
在Python中,字符串是不可变的,也就是说,一旦创建了一个字符串,就不能再对它进行修改。
在本文中,我们将介绍一些常用的字符串方法,以帮助您更好地处理字符串。
1. len()方法len()方法用于获取字符串的长度,即字符串中字符的个数。
例如,如果我们有一个字符串s,我们可以使用len(s)来获取它的长度。
下面是一个示例:s = "Hello, World!"print(len(s))输出结果为:132. lower()方法lower()方法用于将字符串中的所有字符转换为小写字母。
例如,如果我们有一个字符串s,我们可以使用s.lower()来将它转换为小写字母。
下面是一个示例:s = "Hello, World!"print(s.lower())输出结果为:hello, world!3. upper()方法upper()方法用于将字符串中的所有字符转换为大写字母。
例如,如果我们有一个字符串s,我们可以使用s.upper()来将它转换为大写字母。
下面是一个示例:s = "Hello, World!"print(s.upper())输出结果为:HELLO, WORLD!4. strip()方法strip()方法用于去除字符串中的空格或指定的字符。
例如,如果我们有一个字符串s,我们可以使用s.strip()来去除它的空格。
下面是一个示例:s = " Hello, World! "print(s.strip())输出结果为:Hello, World!5. replace()方法replace()方法用于将字符串中的指定字符替换为另一个字符。
例如,如果我们有一个字符串s,我们可以使用s.replace("H", "J")来将其中的"H"替换为"J"。
数据结构第四章:串
例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个字符。*/ 个字符。 串其中 且数组 至少可容纳 个字符
什么是字符串
什么是字符串?字符串(String)是一种在编程中常用的数据类型,用于表示和操作文本数据。
字符串是由字符组成的序列,可以包含字母、数字、符号和空格等字符。
字符串在计算机内部通常以字符数组的形式存储,其中每个字符占据一定的内存空间。
字符可以是任何Unicode字符,包括ASCII字符和扩展字符。
字符串的主要特点如下:1. 不可变性:字符串是不可变的,意味着一旦创建,它的值不能被改变。
当对字符串进行修改时,实际上是创建了一个新的字符串对象。
2. 字符串字面量:大多数编程语言支持使用字符串字面量来表示字符串。
字符串字面量是用引号(单引号或双引号)括起来的字符序列。
3. 字符串操作:字符串支持许多常见的操作,如连接(拼接)、截取、查找、替换、比较等。
这些操作可以根据具体编程语言的提供的函数或方法来实现。
4. 字符串长度:字符串的长度是指字符串中字符的数量。
可以通过内置函数或方法来获取字符串的长度。
创建字符串的语法因编程语言而异,以下是一些常见的示例:在C语言中,使用字符数组来表示字符串的示例:```char str[] = "Hello, World!"; // 创建一个字符串```在Java语言中,使用字符串字面量创建字符串的示例:```String str = "Hello, World!"; // 创建一个字符串```在Python语言中,使用引号括起来的字符序列来表示字符串的示例:```str = "Hello, World!" # 创建一个字符串```通过字符串操作,我们可以进行各种常见的操作。
例如,连接两个字符串可以使用字符串拼接操作符(`+`)。
截取字符串可以使用子字符串函数或方法。
查找字符串中特定字符或子字符串可以使用查找函数或方法,如`indexOf`。
替换字符串中的某些字符可以使用替换函数或方法,如`replace`。
比较字符串可以使用相等性运算符(`==`)或比较函数或方法。
第4章:数组和字符串
4.1.1一维数组
2. 创建一维数组
创建一维数组就是为数组分配存储空间,需指定数组长度。 数组创建后,数组名就标识用于存储数组元素的存储空间(引用)。 创建一维数组的3种方法:
(1) 先声明后创建
数组元素类型 数组名[]; 数组名 = new 数组元素类型[元素个数] ; 如:int intArray []; intArray = new int[5];4.2.3 字符串基本操作
字符串比较的注意事项:
表达式 str1.equals(str2)与表达式 str1==str2 的差异 在于:
• 前者表示所引用的两个字符串的内容是否相同, • 后者表示str1 与 str2是否引用同一个对象。 【实战编程技巧:如何避免潜在的空指针异常】
练习题
4.1 数组
4.2 字符串
4.1 数组
数组是将一组相同类型的数据顺序存储,组成的一 种复合数据类型。 数组的特点:
数组中的所有元素的数据类型相同。 数组中的元素连续顺序存储。 数组中每个元素按存储顺序对应一个下标,下标从0开始顺序编号 ,引用数组元素通过数组名和它的下标确定。 数组有一维数组和多维数组之分,数组元素的下标个数确定数组的 维数。
练习题
【真题练习】设有数组a和b的定义如下: int[]a={1,2,3}; int[]b={4,5,6} …… 执行以下代码“a=b;”,除了完成赋值操作之外,引起 系统额外要做的工作是_________。
第四章 串
第四章串串的定义串的操作数据结构之串24.1 串的定义¾串:由零个或多个字符组成的有限序列,记为S= “a1a2a3……an”。
¾主串、子串、串名、串长;S=“How are you,everybody!”¾空串、空格串;¾字符在串中的位置、子串在串中的位置;¾两个串相等,当且仅当两个串值相等,即长度,位置相等;数据结构之串34.2 串的基本操作¾StrAssign(&T,chars)¾StrCompare(S,T): S、T相等返回true,否则返回faule;¾StrLength(S) : 求串中字符的个数;¾ConCat(S,T) : 将串T的值紧接着放在串S的末尾,组成一个新串;¾SubString(Sub,S,start,length): 求S从start位置开始,长度为length 的子串;数据结构之串4¾SetEmpty(&T) : 设置空串¾StrCopy(S,T): 把T值赋给S;¾Index(S,T,pos): 求子串在主串中位置的定位函数;¾Replace(S,T,v): 以v替换所有在S中出现的和T相等的串;¾StrInsert(S,Pos,T): 在串S的第Pos个字符之前插入串T;¾StrDelete(S,Pos,len): 从串S中删除Pos个字符起长度为len的子串;数据结构之串54.3 串的表示和实现¾定长顺序存储表示¾紧缩格式:在一个存储单元中存放多个字符¾非紧缩格式:一个存储单元中只存放一个字符,所需存储单元个数即串的长度例:如一个单元存放k个字符,长度为n,则此串值占[n/k]个存储单元。
DTA:SAAD T ASW T RCU T UEF S一个存储单元数据结构之串6¾动态分配串值的存储空间;¾动态串的类型定义:typedef struct{char *ch;int length; //串的长度}HS;数据结构之串7¾串的链式存储#define CHUNKSIZE 80 /*由用户定义的块长度*/ typedef struct Chunk {char ch[CHUNKSIZE]; /*字符串块*/struct Chunk *next; /*指向下一个字符串块*/ }Chunk; /*结构名称*/typedef struct {Chunk *head, *tail; /*指向头尾的指针*/int curlen; /*串的当前长度*/} LString; /*串名称*/F A B C1^A B C D E F G H1###^F数据结构之串8¾串基本操作的实现¾将串S1和串S2联接成新串¾算法描述:¾给T分配存储空间,存储空间大小为S1和S2长度之和。
数据结构(CC++语言版)第4章串
•
else return -1;
•}
34
4.3 模式匹配
35
4.3 模式匹配
朴素的模式匹配——BF算法分析
为什么BF算法时间性能低?
在每趟匹配不成功时存在大量回溯,没有利用已经 部分匹配的结果。
如何在匹配不成功时主串不回溯?
主串不回溯,模式就需要向右滑动一段距离。
如何确定模式的滑动距离?
36
4.3 模式匹配
T[strLength(S1) +i]=S2[i]; strLength(T) =MAXSTRLEN; return FALSE; } }
CompStr (S, T)
初始条件:串 S 和 T 存在。 操作结果:若S T,则返回值 0;
若S T,则返回值 0; 若S T,则返回值 0
例如:CompStr(data, state) < 0 CompStr(capture, case) > 0
• 由于在计算机科学、生物信息学等许多领域的重要应用, 串模式匹配已经变成了一个非常重要的计算问题
28
4.3 模式匹配
常用的模式匹配算法: • 朴素的模式匹配(BF算法) • 无回溯的模式匹配(KMP算法) 其他模式匹配算法
29
4.3 模式匹配
朴素的模式匹配——BF算法
基本思想:从主串S的第一个字符开始和模式T 的第 一个字符进行比较,若相等,则继续比较两者的后 续字符;否则,从主串S的第二个字符开始和模式T 的第一个字符进行比较,重复上述过程,直到T 中的 字符全部比较完毕,则说明本趟匹配成功;或S中字 符全部比较完,则说明匹配失败。
S1="ab12 cd " S2="ab12" S3=“cd"
第4章 串
第四章串讲课提要【主要内容】1.串的有关概念及基本操作2.串的存储结构3.串操作应用举例【教学目标】1.掌握串的有关概念及基本运算2.熟悉串的存储结构3.熟悉串操作应用举例学习指导1.概念和术语•串(String)(或字符串):是由零个或多个字符组成的有限序列。
一般记为s= “a1a2…an”(n≥0)其中,s是串的名,用双引号括起来的字符序列是串的值。
•串的长度:串中字符的个数n。
•子串和主串:串中任意个连续的字符组成的子序列称为该串的子串。
包含子串的串相应地称为主串。
•空串:不包含任何字符的串,表示为“Ф”。
•空格串:由一个或多个空格字符组成的串。
例如:“”。
2.串的基本操作(1)用串变量赋值assign(s,t)和用串常量赋值create(s,ss)(2)判等函数equal(s, t)(3)求长函数length(s)(4)连接函数concat(s,t)(5)求子串函数substring(s, pos , len)(6)定位函数index(s,t)(7)置换函数replace(s,t,v)(8)插入子串insert(s,pos,t)(9)删除子串delete(s,pos,k)(10)串的复制copy(s,t)【例3-1】已知字符串:a=“an apple”,b=“other hero”,c=“her”,求:(1)concat(substr(a,1,2),b)。
(2)replace(a,substr(a,5,1),c)。
(3)index(a,c)和index(b,c)。
解:(1)返回值为“another hero”,其中substr(a,1,2)的返回值为“an”。
(2)返回值为“an aherherle”,其中sub(a,5,1)的返回值为“p”。
(3)返回值分别为0和3。
3.串的顺序存储结构(顺序串)串的顺序存储方式类似于线性表的顺序存储方式,其存储结构用C语言描述为:typedef struct strnode {char data[maxlen];int len;}SeqString; //定义顺序串类型【例3-2】设定串采用顺序存储结构,写出对串s1和串s2比较大小的算法。
数据结构-第四章串
数据结构-第四章串串也叫字符串,它是由零个或多个字符组成的字符序列。
基本内容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相同的⼦串的⾸字母在主串中的位置。
c语言函数库-第四章(字符串函数)
c语言函数库第四章(字符串函数)1. atof:字符串转浮点型函数 (1)2. atoi:字符串转整型函数 (2)3. atol:字符串转长整型函数 (3)4. memchr:字符搜索函数 (4)5. memcmp:字符串比较函数 (4)6. memcpy:字符串拷贝函数 (5)7. memmove:字块移动函数 (6)8.memset:字符加载函数 (8)9. strcat:字符串连接函数 (8)10. strchr:字符串中字符首次匹配函数 (9)11. strcmp:字符串比较函数 (10)12. strcpy:字符串拷贝函数 (11)13. strcspn:字符集逆匹配函数 (12)14. strdup:字符串新建拷贝函数 (13)15. strerror:字符串错误信息函数 (14)16. strlen:计算字符串长度函数 (15)17. strlwr:字符串小写转换函数 (16)18. strncat:字符串连接函数 (16)19. strncmp:字符串子串比较函数 (17)20. strncpy:字符串子串拷贝函数 (18)21. strpbrk:字符集字符匹配函数 (19)22. strrchr:字符串中字符末次匹配函数 (20)23. strrev:字符串倒转函数 (21)24. strset:字符串设定函数 (22)25. strspn:字符集匹配函数 (22)26. strstr:字符串匹配函数 (23)27. strtod:字符串转换成双精度函数 (24)28. strtok:字符串分隔函数 (25)29. strtol:字符串转换成长整型函数 (27)30. strtoul:字符串转换成无符号长整型函数 (28)31. strupr:字符串大写转换函数 (29)32. strupr:字符串大写转换函数 (29)1.atof:字符串转浮点型函数函数原型:float atof(const char *str);头文件:#include<stdlib.h>是否是标准函数:是函数功能:将字符串转换成浮点值,也就是将字符串str转换成浮点值然后获取转换后的结果。
数据结构 第四章 串
第四章串串又称字符串,是一种特殊的线性表,它的每个元素仅由一个字符组成。
计算机上非数值处理的对象基本上是字符串数据。
在较早的程序设计语言中,字符串仅作为输入和输出的常量出现。
随着计算机应用的发展,在越来越多的程序设计语言中,字符串也可作为一种变量类型出现,并产生了一系列字符串的操作。
在信息检索系统、文字编辑程序、自然语言翻译系统等等应用中,都是以字符串数据作为处理对象的。
本章将讨论串的存储结构和基本操作。
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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
char *str;
int length;
} HSstrtype;
4.2.2 串名的存储映象 串名的存储映象就是建立了串名和串值之间的对应关系的一个符 号表。在这个表中的项目可以依据实际需要来设置,以能方便地 存取串值为原则。 如: s1=〃data〃 s2=〃structure〃 假若一个单元仅存放1个字符,则上面两个串的串值顺序存储如图 4-5所示。 若符号表中每行包含有串名、串值的始地址、尾地址,则如图4-6 (a)所示,也可以不设尾地址,而设置串和长度值。则如图4-6 (b)所示。
用块链存放字符串时,其结构用C语言定义如下:
typedef struct node{
char str[4];
struct node *next;
} slstrtype;
(2)堆存储结构
堆存储结构的特点是,仍以一组空间足够大的、地址连续的存储单元存放串值 字符序列,但它们的存储空间是在程序执行过程中动态分配的。每当产生一个 新串时,系统就从剩余空间的起始处为串值分配一个长度和串值长度相等的存 储空间。 在C语言中,存在一个称为“堆”的自由空间,由动态分配函数malloc()分配一 块实际串长所需的存储空间,如果分配成功,则返回这段空间的起始地址,作 为串的基址。由free()释放串不再需要的空间。 用堆存放字符串时,其结构用C语言定义如下:
另一种是定义字符指针变量,存储串值的首地址 ,通过字符指针变量名访问串值,串的存储空间 分配是在程序运行时动态分配的,这种方式称为 串的动态存储结构。
4.2.1 串值的存储
我们称串是一种特殊的线性表,因此串的存储结构表示也有两种方法:静态存储采用 顺序存储结构,动态存储采用的是链式存储和堆存储结构。
1.串的静态存储结构
类似于线性表的顺序存储结构,用一组地
址连续的存储单元存储串值的字符序列。由
于一个字符只占1个字节,而现在大多数计算
图机的存储器地址是采用的字编址,一个字(
4
即 -
1
一
个
存
储
单
元
)
占
多
个
字
节
,
因
此
顺
序
存
串值储结构方式有两种:
的
紧 缩
(1)紧缩格式:即一个字节存储一个字符
格
。 式
存
这
对于链式存储串值的方式,如果要建立串变量的符号表,则只需要存入一个链 表的表头指针即可。
4.3 串的基本运算及其实现
串的基本运算有赋值、联接、求串长、求子串、求子串在主串中出现的位置、判断两个 串是否相等、删除子串等。在本节中,我们尽可能以C语言的库函数表示其中的一些运 算,若没有库函数,则用自定义函数说明。
(1)链式存储结构
串的链式存储结构中每个结点包含字符域和结点链接指针域,字符域用于
存放字符,指针域用于存放指向下一个结点的指针,因此,串可用单链表表 示。 用链表存放字符串时,其结构用C语言定义如下:
typedef struct node{
char str;
struct node *next;
} slstrtype; 用单链表存放串,每个结点仅存储一个字符,如图4-3所示,因此,每个结 点的指针域所占空间比字符域所占空间要大得多。为了提高空间的利用率, 我们可以使每个结点存放多个字符,称为块链结构,如图4-4所示每个结点 存放4个字符。
例如, S = “Tsinghua University”
4.1 串的基本概念
4.1.1 串的定义 串(或字符串)(String)是由零个或多个字 符组成的有限序列。一般记作 s=〃c0c1c2…cn-1〃 (n≥0)
4.1.2 主串和子串
一个串的任意个连续的字符组成的子序列称为该串的子串 ,包含该子串的串称为主串。
第四章 字符串 (String)(4学时)
重点:串的基本运算、串的匹配算法; 难点:KMP算法。 知识点: 串的基本概念 串所支持的9种基本运算 表示串的数据结构
串的匹配算法。
字符串 (String)
字符串是 n ( 0 ) 个字符的有限序列, 记作 S : “c1c2c3…cn” 其中,S 是串名字 “c1c2c3…cn”是串值 ci 是串中字符 n 是串的长度。
称一个字符在串序列中的序号为该字符在串中的位置,子 串在主串中的位置是以子串的第一个字符在主串中的位置来 表示的。当一个字符在串中多次出现时,以该字符第一次在 主串中出现的位置为该字符在串中的位置。
例 如 : s1 、 s2 、 s3 为 如 下 的 三 个 串 : s1=〃I’m a teacher〃;s2=〃
义串的最大长度,这在程序运行前是很难估计的。二是由于定义了串的最
大长度,使得串的某些操作受限,如串的联接运算等。
2.串的动态存储结构
我们知道,串的各种运算与串的存储结构有着很大的关系,在随机取子串时 ,顺序存储方式操作起来比较方便,而对串进行插入、删除等操作时,就会 变得很复杂。因此,有必要采用串的动态存储方式。 串的动态存储方式采用链式存储结构和堆存储结构两种形式:
用字符数组存放字 <允许的最大的字符数>
图
4
-
2
typedef struct {
串
值 的
char str[MAXNUM];
非 紧
int length; /*串长度*/
缩 格
} stringtype; /* 串类型定义*/
式
存
储
由上述讨论可知,串的顺序存储结构有两大不足之处:一是需事先预定
student〃;s3=〃teacher〃。 则它们的长度分别为13、7、7;串s3是s1的子串,子串s3在s1中的位
置为7,也可以说s1是s3的主串;串s2不是s1的子串,串s2和s3不相等。
4.2 串的存储结构
在C语言中可以有两种方式: 一是可以将串定义为字符型数组,数组名就是串 名,串的存储空间分配在编译时完成,程序运行 时不能更改。这种方式为串的静态存储结构。
种
存
储
方
式
可
以
在
一
个
存
储
单
元
中
存
放
储多个字符,充分地利用了存储空间。但在串
的操作运算时,若要分离某一部分字符时,
则变得非常麻烦。
da t a
└s t r ┘ uc tu
r e \0
图4-1 串值的紧缩格式存储
(2)非紧缩格式:这种方式是以一个存储单元为单位,每 个存储单元仅存放一个字符。这种存储方式的空间利用率较 低,如一个存储单元有4个字节,则空间利用率仅为25%。但 这种存储方式中不需要分离字符,因而程序处理字符的速度 高。图4-2即为这种结构的示意图。