数据结构中的串
数据结构第四章 串

数据结构第四章串在数据结构的世界里,串是一种非常基础且重要的结构。
它看似简单,却在很多实际的程序设计和应用中发挥着关键作用。
串,简单来说,就是由零个或多个字符组成的有限序列。
这就好比我们日常生活中的一句话、一段文字或者一个密码。
从存储方式上来看,串可以采用顺序存储和链式存储两种方式。
顺序存储就像是把一串珠子穿在一根线上,珠子依次排列,位置固定。
在计算机中,我们可以用一个连续的数组来存储串中的字符。
这种方式简单直观,访问速度快,但存在着一些局限性。
比如说,如果我们事先不知道串的长度,可能会造成存储空间的浪费或者不足。
相比之下,链式存储则更加灵活。
它就像把珠子用链条串起来,每个珠子(也就是字符)都有一个指针指向下一个珠子。
这样,即使在插入或删除字符时,也不需要像顺序存储那样进行大量的数据移动。
但是,链式存储的缺点是访问速度相对较慢,因为需要通过指针依次查找。
接下来,让我们看看串的一些基本操作。
串的比较是经常会用到的操作。
比较两个串的大小,不能像比较数字那样简单地直接比较,而是要从串的第一个字符开始,逐个字符进行比较。
如果在某个位置上的字符不同,那么 ASCII 码值大的那个串就更大;如果前面的字符都相同,但是一个串先结束了,那么长度短的串就更小。
串的连接也是常见的操作。
想象一下把两段绳子接在一起,就形成了一个更长的绳子。
串的连接也是类似的道理,把两个串首尾相连,形成一个新的串。
但在实际操作中,要注意存储空间的分配,确保有足够的空间来容纳连接后的串。
还有串的子串操作。
比如说,从一篇文章中截取一段文字,这就是获取一个子串。
在程序中,我们需要明确指定子串的起始位置和长度,才能准确地获取到所需的部分。
串的模式匹配更是一个重要的应用。
这就像是在一篇长篇小说中寻找特定的关键词或者短语。
最常见的模式匹配算法有朴素模式匹配算法和 KMP 算法。
朴素模式匹配算法比较直接,就是从主串的开头逐个字符与模式串进行匹配。
而 KMP 算法则通过对模式串进行预处理,利用已经匹配的部分信息,减少不必要的比较,从而提高匹配的效率。
数据结构——第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 串

数据结构-4 串数据结构 4 串在计算机科学中,数据结构是组织和存储数据的方式,以便能够有效地进行操作和访问。
今天,咱们来聊聊数据结构中的“串”。
什么是串呢?简单来说,串就是由零个或多个字符组成的有限序列。
这就好比我们日常说的一句话、一篇文章中的一段文字,都是串的具体表现形式。
串在计算机中的应用非常广泛。
比如说,在文本编辑中,我们输入的每一行文字都可以看作是一个串;在网络通信中,传输的各种信息也常常以串的形式存在;在数据库中,存储的字符数据也可以理解为串。
为了更好地处理串,计算机科学家们设计了各种各样的操作和算法。
首先是串的存储结构。
常见的有两种:顺序存储和链式存储。
顺序存储就像是把一串字符一个挨着一个地放在连续的内存空间里。
这样的好处是可以快速地随机访问串中的任意字符,但缺点是在插入或删除字符时可能需要大量的移动操作。
链式存储则是通过节点把字符连接起来,每个节点存储一个字符以及指向下一个节点的指针。
这种方式在插入和删除操作时比较方便,但随机访问的效率相对较低。
接下来,咱们聊聊串的比较操作。
比较两个串是否相等是很常见的需求。
这可不是简单地看看两个串长得一不一样,还得考虑字符的顺序和数量。
常见的比较方法有逐个字符比较,从串的开头一个一个比下去,直到发现不同或者其中一个串结束。
再说说串的模式匹配。
这是一个很重要的操作,比如说要在一篇长文章中找到某个特定的关键词或者短语,这就用到了模式匹配算法。
其中,著名的有朴素模式匹配算法和 KMP 算法。
朴素模式匹配算法的思路很直接,就是从主串的开头开始,逐个与模式串进行匹配,如果匹配不成功就将模式串往后移动一位继续匹配。
这个算法简单易懂,但效率不是很高,特别是在主串和模式串长度较长时。
KMP 算法则通过对模式串的预处理,计算出一个 next 数组,利用这个数组可以在匹配不成功时更有效地移动模式串,从而提高匹配的效率。
除了上面说的这些,串还有很多其他的操作,比如串的连接、子串提取、串的替换等等。
数据结构第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;
数据结构-第4章 串

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)代表单个字符,可以是字母、 数字或其它字符(包括空白符)。 串值:双引号括起来的字符序列。双引号不是 串的内容,只起标识作用。
数据结构(串)

数据结构(串)数据结构(串)1.介绍1.1 定义数据结构(串)是计算机科学中的一种基础数据结构,用于存储和操作一系列具有相同数据类型的元素的集合。
1.2 特性- 顺序存储:串中的元素按照在字符串中的顺序存储。
- 长度可变:可以动态改变串的长度。
- 计数方式:通常使用0开始计数。
1.3 应用字符串的数据结构广泛应用于文本处理、模式匹配、编译器设计等领域。
2.串的基本操作2.1 创建串:定义一个字符串变量并为其分配内存空间。
2.2 销毁串:释放字符串变量占用的内存空间。
2.3 清空串:将字符串中的元素清空,使字符串变为空串。
2.4 判断串是否为空:判断字符串是否为空串。
2.5 获取串的长度:获取字符串中元素的个数。
2.6 拷贝串:将一个串拷贝到另一个串中。
2.7 两个串:将两个串连接成一个新的串。
2.8 截取子串:从原串中截取一段子串。
2.9 查找子串:在串中查找指定子串的位置。
2.10 替换子串:在串中将指定子串替换成新的子串。
2.11 插入子串:在串中指定位置插入一个子串。
2.12 删除子串:从串中删除指定的子串。
3.串的存储结构3.1 顺序存储结构:使用一维数组存储字符串的字符元素。
3.2 链式存储结构:使用链表存储字符串的字符元素,每个节点存储一个字符。
4.串匹配算法4.1 暴力匹配算法:逐个比较字符串中的字符,若匹配失败则向后移动。
4.2 KMP算法:利用前缀函数预处理,避免重复比较已经匹配的字符。
4.3 Boyer-Moore算法:从匹配串的末尾开始比较,利用坏字符规则和好后缀规则跳过不必要的比较。
5.附件本文档不涉及附件。
6.法律名词及注释- 数据结构:指计算机科学中研究数据存储方式及其相关操作的学科。
- 串:也称为字符串,是由零个或多个字符组成的有序序列。
数据结构-4 串

数据结构-4 串数据结构 4 串在计算机科学中,数据结构是组织和存储数据的方式,以便能够有效地进行操作和处理。
其中,串(String)是一种非常常见且重要的数据结构,它在众多的应用中都发挥着重要的作用。
串,简单来说,就是由零个或多个字符组成的有限序列。
我们日常生活中接触到的各种文本,比如一篇文章、一条短信、一个网页的标题等等,在计算机中都可以用串来表示。
串有其独特的特点。
首先,它具有有限长度。
这意味着串中包含的字符数量是有限的,不能无限增长。
其次,串中的字符通常来自某个特定的字符集,比如常见的ASCII 字符集或者Unicode 字符集。
再者,串中的字符是按照一定的顺序排列的,这个顺序是有意义且不可随意更改的。
为了在计算机中有效地存储和操作串,有多种不同的实现方式。
一种常见的方式是使用字符数组。
我们可以定义一个足够大的字符数组来存储串中的字符。
这种方式直观且简单,但在进行串的修改操作(如插入、删除)时,可能会比较麻烦,因为需要移动大量的字符来腾出空间或者填补空缺。
另一种方式是使用指针和动态分配内存。
通过动态分配内存,可以根据串的实际长度来灵活地分配所需的存储空间。
这样在处理长度变化较大的串时,效率会更高,但也需要注意内存的释放,以避免内存泄漏的问题。
在对串进行操作时,有许多常见的基本运算。
比如串的连接,就是将两个串拼接在一起形成一个新的串。
还有串的比较,判断两个串是否相等,或者哪个串在字典序上更大。
此外,还有子串的提取,从一个串中取出一部分连续的字符形成新的串。
串的应用场景十分广泛。
在文本编辑软件中,对输入的文本进行处理和存储就离不开串。
在数据库系统中,存储和检索字符串类型的数据也需要对串进行有效的管理。
在编程语言中,字符串的处理也是常见的操作,比如字符串的格式化输出、字符串的查找和替换等等。
举个例子,当我们在搜索引擎中输入关键词时,搜索引擎会将我们输入的关键词作为一个串,然后在其庞大的数据库中进行匹配和查找,找到与这个串相关的网页和信息。
第四章 串

– 例如
• 主串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)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
next[j] = max { k | 0<k<j 且使得 1…tk-1=tj-k+1…tj-1} 当集合不空 且使得t 1
首页
其他情况
上页 下页 退出
第四章
§4.4 串的应用
一、文本编辑 二、建立索引表
思考题: 思考题: 试写出判串S是否是回文的算法。 1、试写出判串S是否是回文的算法。 若串S= S=‘ STRING’以块链存储, 2、若串S=‘THIS IS A STRING’以块链存储,结点大小 链指针占4个字节, 32位 问存储密度是多少? 为4,链指针占4个字节,即32位,问存储密度是多少? 是两个但单链表存储的串,试设计一个算法, 3、若X和Y是两个但单链表存储的串,试设计一个算法, 找出X中第一个不在Y中出现的字符来。 找出X中第一个不在Y中出现的字符来。
首页
上页
下页
退出
第四章
§4.1 串类型的定义
三、C语言常用的字符串处理的标准函数: 语言常用的字符串处理的标准函数:
int strlen(char s); int strcmp(chars1,char s2); char strcpy(char to,char from); char strcat(char to,char from) 但在抽象数据类型定义的13种操作中, 13种操作中 但在抽象数据类型定义的13种操作中,串赋值 StrAssign、串复制StrCopy、串比较StrCompare、求串 StrAssign、串复制StrCopy、串比较StrCompare、 StrCopy StrCompare StrLength、串联接Concat以及求子串SubString Concat以及求子串SubString等 长StrLength、串联接Concat以及求子串SubString等6 种操作构成串类型的最小操作子集。 种操作构成串类型的最小操作子集。 例如,可利用判等、 例如,可利用判等、求串长和求子串等操作实现串 的定位函数 Index(S,T,pos) 和串的置换操作 Replace(S,T,V)。 。 换句话说,如果在高级程序设计语言中设有"串类 换句话说,如果在高级程序设计语言中设有 串类 的话, 种操作, 型"的话,提供的基本操作不能没有这 种操作,因为它 的话 提供的基本操作不能没有这6种操作 首页 上页 下页 退出 们不能通过其它串操作实现。 们不能通过其它串操作实现。
第四章
串
——数据类型特殊的线性表 数据的表示和实现 4.3 串的模式匹配 4.4 串的应用
第四章
§4.1 串类型的定义
一、串的特点:数据元素为字符或字符串的线性表叫做串。 串的特点:数据元素为字符或字符串的线性表叫做串。 是由零个或多个字符组成的有限序列。 是由零个或多个字符组成的有限序列。 基本术语:长度、空串、空格串、位置、相等、主串、 基本术语:长度、空串、空格串、位置、相等、主串、 子串等。 子串等。 ADT定义 定义: 二、ADT定义:
第四章
int Index (String S, String T, int pos) { // T为非空串。若主串 中第 pos 个字符之后存在与 相等的子串, 为非空串。 个字符之后存在与T相等的子串 相等的子串, 为非空串 若主串S中第 // 则返回第一个这样的子串在 中的位置,否则返回 。 则返回第一个这样的子串在S中的位置 否则返回0。 中的位置, if (pos > 0) { n = StrLength(S); m = StrLength(T); // 求得串长 i = pos; while ( i <= n-m+1) { SubString (sub, S, i, m); // 取得从第 i 个字符起长度为 m 的子串 if (StrCompare(sub,T) != 0) ++i ; else return i ; // 找到和 T 相等的子串 } // while } // if return 0; // S 中不存在满足条件的子串 } // Index 实现Index(S,T,pos)算法的基本思想 算法的基本思想为:从主串S中取“第 i 个字符起、 算法的基本思想 长度和串T相等的子串”和串T比较,若相等,则求得函数值为 i,否 则 i 值增1直至找到和串T相等的子串或者串S中不存在和T相等的子 串为止。即求使下列等式 StrCompare(SubString(S,i,StrLength(T)),T)==0 成立的 i 值。i 的初值应为 pos,在找不到的情况下,i 的终值应该是 n-m+1,其中,n 为S串的长度,m 为T串的长度。
首页
上页
下页
退出
第四章
个字符的有限序列。 串(string,或称字符串)是 n 个字符的有限序列。通常记作 ,或称字符串) s = " … " (n≥0) 其中, 是串的名 用双引号括起来的字符序列是串的值。 是串的名, 其中,S是串的名,用双引号括起来的字符序列是串的值。串 称为串的长度。含零个字符的串称为空串(null 中字符的数目 n 称为串的长度。含零个字符的串称为空串 string),它的长度为零。在各种应用中,空格通常是串的字符集合 ,它的长度为零。在各种应用中, 中的一个元素,可以出现在其他字符之间。 中的一个元素,可以出现在其他字符之间。由一个或多个空格组成 的串称为空格串(blank string),例如 的串称为空格串 , " "," "和" " , 是三个空格串,它们的长度为串中空格字符的个数,分别为1, 是三个空格串,它们的长度为串中空格字符的个数,分别为 , 5和8。为了清楚起见,以下将用符号 表示"空格符 和 。为了清楚起见,以下将用符号"Φ"表示 空格符 。 表示 空格符"。 串值必须用一对双引号括起来,但双引号本身不属于串, 串值必须用一对双引号括起来,但双引号本身不属于串,它 的作用只是为了避免与变量或数的常量混淆而已。 的作用只是为了避免与变量或数的常量混淆而已。
一、求子串位置的定位函数Index(S,T,pos)(BF方法) 求子串位置的定位函数Index(S,T,pos)(BF方法 方法) 算法:int Index(SString S,SString T, int pos) {
i=pos; j=1; while(i<=S[0] && j<=T[0]) { if (S[i]==T[j]) { ++i ; ++j ; } else { i=i-j+2 ; j=1 ;} } if (j>T[0]) return i-T[0]; else return 0; }
首页
上页
下页
退出
首页 上页 下页 退出
第四章
§4.2 串的表示和实现
1、定长顺序存储
表示: #define MAXSTRLEN 255 typedef unsigned Sstring[MAXSTRLEN+1]; 实现: Concat(&T,S1,S2) SubString(&Sub,S,pos,len)
类似于线性表的顺序存储结构, 类似于线性表的顺序存储结构,可用一组地址连续的 存储单元存储串值的字符序列。例如C和 存储单元存储串值的字符序列。例如 和C++语言中串不是 语言中串不是 预定义的数据类型,而是以字符数组来表示串。 预定义的数据类型,而是以字符数组来表示串。如声明 char str[10]; 是一个串变量。 语言中还规定了一个 语言中还规定了一个“串的 表明 str 是一个串变量。C语言中还规定了一个 串的 称为空终结符), 结束标志 ‘\0’”(字符 ‘\0’称为空终结符),即数组中在该 ( 称为空终结符),即数组中在该 结束标志之前的字符是串变量的有效字符, 结束标志之前的字符是串变量的有效字符,但结束标志本 身要占一个字符的空间, 的值(字符序列) 身要占一个字符的空间,因此串变量 str 的值(字符序列) 的实际长度可在这个定义范围内随意,但最大不能超过9。 的实际长度可在这个定义范围内随意,但最大不能超过 。
数据对象:D={ai |ai ∈ CharacterSet , i=1,2,…,n, n>=0} 数据对象 数据关系:R1={<ai-1,ai>|ai-1,a i ∈ D} 数据关系 基本操作:(部分) 基本操作 StrAssign(&T,chars) StrCopy(&T,S) StrCompare(S,T) StrLength(S) Concat(&T,S1,S2) SubString(&Sub,S,pos,len) Index(S,T,pos) Replace(&S,T,V) StrInsert(&S,pos,T) StrDelete(&S,pos,len)
首页
上页
下页
退出
第四章
由于在一般情况下, 由于在一般情况下, 串的操作都是从前往后进 3、串的块链存储 行的, 行的,因此串的链表通常 #define CHUNKSIZE 80 不设双链,也不设头结点, 不设双链,也不设头结点, typedef struct Chunk { 但为了便于进行诸如串的 char ch[CHUNKSIZE]; 联接等操作,链表中还附 联接等操作, struct Chunk *next; 设有尾指针, 设有尾指针,并且由于串 }Chunk; 的长度不一定是结点大小 的整数倍( 的整数倍(链表中最后一 typedef struct{ 个结点中的字符非都是有 Chunk *head, *tail; 效字符), ),因此还需要一 效字符),因此还需要一 int curlen; 个指示串长的域。 个指示串长的域。称如此 } LString; 定义的存储结构为串的块 存储密度:串值所占的存储位 链存储结构 实际分配的存储位 以块链作存储结构时实现串的操作很不方便,如在串中 插入一个子串时可能需要分割结点,联接两个串时,若第一 个串的最后一个结点没有填满时还需要添加其它字符等等。 但在应用程序中,可将串的链表存储结构和串的定长结构结 合使用。 首页 上页 下页 退出