4、串

合集下载

4 串

4 串

}
4.3.2 KMP 算法
由D.E.Knuth、J.H.Morris和V.R.Pratt共同提出了一个改进算法, 消除了Brute-Force算法中串s指针的回溯,完成串的模式匹配。时 间复杂度为O(s.curlen+t.curlen),这就是Knuth-Morris-Pratt算法, 简称KMP 算法。 为了进一步讨论KMP算法,让我们首先讨论一个例子。假设 s=‚abacabab‛,t=‚abab‛,第一次匹配过程如下图所示:
1)j 退回到某个j=next[j]时有 si = tj,则指针各增1,继续匹配;
2)j 退回至 j=-1,此时令指针各增l,即下一次比较 si+1和 t0 。
KMP算法的描述如下: #define MaxLen <最大串的长度> //定义最大串存储空间 int Index_KPM(string s,string t) { int i,j,next[MaxLen]; GetNext(t,next); //先求得模式串的next函数值 i=0; //指向串s的第1个字符 j=0; //指向串t的第1个字符 while((i<s.curlen)&&(j<t.curlen)) if ((j==-1)||(s.str[i]==t.str[j])) { ++i; ++j;} else j=next[j]; //i不变,j回退 if (j>=t.curlen) return (i-t.curlen); //匹配成功 else return(0); //匹配失败 }
如:s=〃I’m a student〃的长度为13。 注意:在C语言中,用单引号引起来的单个字符与单个字符的 串是不同的, 如s1=‘a’与s2=〃a〃两者是不同的,s1表示字 符,s2表示字符串。 当两个串的长度相等且各对应位臵上的字符都相同时,这两个 串是相等的。 串中任意个连续字符组成的序列称为该串的子串。包含子串的 串被称为主串。 例如, "com"、"om"、"a" 和 "man" 都是 "commander" 的子串 。子串在主串中的位臵是指子串中第一个字符在主串中的位臵序 号。如子串"man"在主串"commander"中的位臵为4。

数据结构第4章 串

数据结构第4章  串
ring s, SString t)
/*若串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章 串
真子串是指不包含自身的所有子串。
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)代表单个字符,可以是字母、 数字或其它字符(包括空白符)。 串值:双引号括起来的字符序列。双引号不是 串的内容,只起标识作用。

数据结构-4 串

数据结构-4 串

数据结构-4 串数据结构 4 串在计算机科学中,数据结构是组织和存储数据的方式,以便能够有效地进行操作和处理。

其中,串(String)是一种非常常见且重要的数据结构,它在众多的应用中都发挥着重要的作用。

串,简单来说,就是由零个或多个字符组成的有限序列。

我们日常生活中接触到的各种文本,比如一篇文章、一条短信、一个网页的标题等等,在计算机中都可以用串来表示。

串有其独特的特点。

首先,它具有有限长度。

这意味着串中包含的字符数量是有限的,不能无限增长。

其次,串中的字符通常来自某个特定的字符集,比如常见的ASCII 字符集或者Unicode 字符集。

再者,串中的字符是按照一定的顺序排列的,这个顺序是有意义且不可随意更改的。

为了在计算机中有效地存储和操作串,有多种不同的实现方式。

一种常见的方式是使用字符数组。

我们可以定义一个足够大的字符数组来存储串中的字符。

这种方式直观且简单,但在进行串的修改操作(如插入、删除)时,可能会比较麻烦,因为需要移动大量的字符来腾出空间或者填补空缺。

另一种方式是使用指针和动态分配内存。

通过动态分配内存,可以根据串的实际长度来灵活地分配所需的存储空间。

这样在处理长度变化较大的串时,效率会更高,但也需要注意内存的释放,以避免内存泄漏的问题。

在对串进行操作时,有许多常见的基本运算。

比如串的连接,就是将两个串拼接在一起形成一个新的串。

还有串的比较,判断两个串是否相等,或者哪个串在字典序上更大。

此外,还有子串的提取,从一个串中取出一部分连续的字符形成新的串。

串的应用场景十分广泛。

在文本编辑软件中,对输入的文本进行处理和存储就离不开串。

在数据库系统中,存储和检索字符串类型的数据也需要对串进行有效的管理。

在编程语言中,字符串的处理也是常见的操作,比如字符串的格式化输出、字符串的查找和替换等等。

举个例子,当我们在搜索引擎中输入关键词时,搜索引擎会将我们输入的关键词作为一个串,然后在其庞大的数据库中进行匹配和查找,找到与这个串相关的网页和信息。

数据结构4串4

数据结构4串4

#define CHUNKSIZE 80 // 可由用户定义的块大小 typedef struct BNode { char data[CHUNKSIZE];//块内连续字符结点成员 struct BNode *next; } typedef struct { struct BNode *head ,*tail ;// 串的头和尾指针 int curlen; // 串的当前长度 } LString; //串的类型是一个结构 LString s;
三.串的块链存储方式
Head a Head a b c d e f g h i # # # /\ b c … i /\
例如: 在编辑系统中,整个文本编辑区可以看成是一个 串,每一行是一个子串,构成一个结点。即: 同一行的 串用定长结构(80个字符),行和行之间用指针相联接。
为了便于进行串的操作,除头指针外还可附设一 个尾指针指示链表中的最后一个结点,并给出当 前串的长度。称这种结构为块链结构。
a c
b
c
a
c b
a
b
i=3 i=4 i=5 i=6 i=7
第三趟:a
b
a a
b b
c c
a a
b c
c
a
c b
a
b
j=1 j=2 j=3 j=4 j=5 i=4
第四趟:a
b
a
b a
j=1
c a b c
b a
c a c
c
b
a
b
i=5
第五趟:a
b
a
b
c a
j=1
a b
b c
c a
a c
c b
a
b
i=6 i=7 i=8 i=9 i=10i=11

第四章 串

第四章 串
主串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 串

由样本串t求出next值的算法如下:
void getnext(char p[], int next[],int m) { int j,i;
next[1]=0;
for (j=2; j<=m; j++) { i=next[j-1];
while (i>0&&p[i]!=p[i-1])
i=next[i]; next[j]=i+1; } ruturn ; } }
(3)灵活运用串这种数据结构解决一些综合 应用问题。
a
i=9
j=1 i=10→17
第十趟
文本 a b a a b a a c c a b a a b c a b c
abaabca
j=1→8
在i=17, j=8时匹配成功, 返回10。
int index(char T[], char P[], int n, int m) { int i=1,j=1;
while ((i<n-m+1) && (j<m)) { if (T[i]==P[j]) /*继续匹配下一个字符*/ { i++; j++; } /*主串和子串依次匹配下一个字符*/ else /*主串、子串指针回溯重新开始下一次匹配*/ { i=i-j+2; /*主串从下一个位置开始匹配*/ j=1; /*子串从头开始匹配*/ } } if (j>m) retunr i-m+1; /*返回匹配的第一个字符的下标*/ else return 0; /*模式匹配不成功*/
结论:模式匹配过程中没有回溯。
第一趟
文本 a b a a b a a c c a b a a b c a b c

数据结构第四章串

数据结构第四章串

(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串

4串

第四章 串
在上述抽象数据类型定义的13种操作中, 在上述抽象数据类型定义的 种操作中, 串赋 种操作中 值StrAssign、 串比较 、 串比较StrCompare、求串长 、 StrLength、 串联接 、 串联接Concat以及求子串 以及求子串SubString 以及求子串 等五种操作构成串类型的最小操作子集。 等五种操作构成串类型的最小操作子集。 即:这 些操作不可能利用其他串操作来实现, 反之,其 些操作不可能利用其他串操作来实现, 反之, 他串操作(除串清除ClearString和串 销毁 他串操作(除串清除 和串 DestroyString外)可在这个最小操作子集上实现。 外 可在这个最小操作子集上实现。
第四章 串
特别的, 空串是任意串的子串, 特别的 , 空串是任意串的子串 , 任意串是 自身的子串。 自身的子串。 通常在程序中使用的串可分为两种: 通常在程序中使用的串可分为两种 : 串变 串常量。 串常量和整常数、 实常数一样, 量 和 串常量 。 串常量和整常数 、 实常数一样 , 在程序中只能被引用但不能改变其值, 在程序中只能被引用但不能改变其值 , 即只能 读不能写。 通常串常量是由直接量来表示的, 读不能写 。 通常串常量是由直接量来表示的 , Error(“overflow overflow”) overflow” 例 如 语 句 Error( overflow ) 中 “ overflow 是 直接量。 但有的语言允许对串常量命名, 直接量 。 但有的语言允许对串常量命名 , 以使 程序易读、 易写。 程序易读 、 易写 。 串变量和其它类型的变量一 其取值是可以改变的。 样,其取值是可以改变的。
第四章 串Biblioteka 第四章 串第四章 串
4.1 串类型的定义 4.2 串的表示和实现 4.3 串的模式匹配算法 4.4 串操作应用举例

数据结构第四章:串

数据结构第四章:串

例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 串

数据结构-4 串数据结构 4 串在计算机科学的广袤世界中,数据结构就像是一座精巧构建的大厦,为我们处理和管理数据提供了坚实的基础。

而在这众多的数据结构中,串(String)是一个十分常见且重要的存在。

串,简单来说,就是由零个或多个字符组成的有限序列。

它在我们的日常生活和计算机程序中无处不在。

比如我们日常输入的文本、网页上的各种字符串信息,甚至是程序代码中的标识符和字符串常量,都属于串的范畴。

从存储结构上来看,串可以有两种主要的存储方式:顺序存储和链式存储。

顺序存储方式就像是一个排列整齐的队列。

我们为串分配一块连续的存储空间,然后按照顺序依次存放串中的字符。

这种方式的优点是随机访问速度快,如果我们想要获取串中的某个特定位置的字符,能够迅速定位并获取。

但它也有缺点,那就是当串的长度发生变化时,尤其是需要增长时,可能会面临重新分配存储空间和数据搬移的操作,这会带来一定的性能开销。

与之相对的链式存储,则像是串起的一颗颗珍珠。

每个节点存储一个字符,并通过指针将各个节点连接起来。

这种方式在串的长度动态变化时,更加灵活,不需要进行大规模的数据搬移。

但它的随机访问速度相对较慢,因为要通过指针依次遍历才能找到特定位置的字符。

在实际应用中,我们常常会用到串的基本操作。

比如串的赋值,将一个串的值赋给另一个串;串的连接,把两个串拼接成一个新的串;串的比较,判断两个串是否相等或者哪个串更大;还有子串的提取,从一个串中取出一部分连续的字符组成新的串。

以串的比较为例,这可不是简单地看两个串的长度或者逐个字符比较那么简单。

在不同的应用场景中,可能会有不同的比较规则。

比如,在不区分大小写的情况下比较两个字符串,或者按照特定的编码规则进行比较。

再来说说串的模式匹配。

这是串处理中的一个重要问题。

想象一下,我们在一篇长篇文章中寻找特定的关键词或短语,这其实就是在进行串的模式匹配。

常见的模式匹配算法有朴素的模式匹配算法和 KMP 算法。

数据结构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;
讨论:想存放超长字符串怎么办?
用定长的字符数组来定义,数组的上界预先给出,故称为静态存 储分配。

数据结构(C语言版)4 串与数组

数据结构(C语言版)4  串与数组
结构之前,需要解决将多维关系映射到一维关系的问 题。举例:
15
a 01 a 00 a10 a11 Am n ... ... am 1,0 am 1,1
图 4-4
... a 0, n 1 ... a1, n 1 ... ... ... am 1, n 1
19
(2)返回给定位置的元素内容
int Value(ARRAY A,EntryType *item,int index1,int index2) { if (index1<0||index1>=MAX_ROW_INDEX||
index2<0||index2>=MAX_COL_INDEX) return FALSE;
9
(2)子串 int StrSub (char *t, char *s, int i, int len) /* 用t返回串s中第个i字符开始的长度为len 的子串1≤i≤串长*/ { int slen; slen=StrLength(s); if ( i<1 || i>slen || len<0 || len>slen-i+1) { printf("参数不对"); return 0; } for (j=0; j<len; j++) t[j]=s[i+j-1]; t[j]=’\0’; return 1; }
12
a 01 a 00 a10 a11 Am n ... ... am 1, 0 am 1,1
图 4-3
... a 0, n 1 ... a1, n 1 ... ... ... am 1, n 1
13
其中,A是数组结构的名称,整个数组元素可以 看成是由m个行向量和n个列向量组成,其元素总数为 m×n。在C语言中,二维数组中的数据元素可以表示 成a[表达式1][表达式2],表达式1和表达式2被称为下 标表达式,比如,a[i][j]。

4串

4串

int StrAssign(HString &T,char *chars) { // 生成一个其值等于串常量chars的串T if(T.ch) free(T.ch); //释放T原有空间 for(i=0,c=chars;c;++i,++c); // 求chars的长度i if(!i){T.ch=NULL;T.length=0;} else{ if(!(T.ch=(char *)malloc(i*sizeof(char)))) exit(OVERFLOW); T.ch[0..i-1]=chars[0..i-1]; T.length=i; } return 1; }// StrAssign
作业:利用判等、求串长和求子串等操作实现串的 置换操作 Replace(S,T,V)。
4.2 串的表示和实现
串的定长顺序存储表示
类似于线性表的顺序存储结构,可用一组地址连续的存储单 元存储串值的字符序列。 串的定长顺序存储表示: # define MAXSTRLEN 255 // 用户可在255以内定义最大串长 typedef unsigned char Sstring[MAXSTRLEN+1]; // 0号单元存放串的长度
串的堆分配存储表示 串的堆分配存储的特点是,程序中出现的所有串变量的 存储空间都是在程序执行过程中动态分配而得的。堆分配存 储结构的串定义如下: typedef struct{ char *ch; // 若是非空串,则按串长分配存储区, // 否则ch为NULL int length; // 串长度 } HString;
串的抽象数据类型定义如下:
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) 初始条件:chars 是串常量。 操作结果:赋于串T的值为 chars。 StrCopy (&T, S) 初始条件:串 S 存在。 操作结果:由串 S 复制得串 T。

精彩足球4串4跟4串5奖金有什么区别范文

精彩足球4串4跟4串5奖金有什么区别范文

精彩足球4串4跟4串5奖金有什么区别范文一、4串4和4串5都是允许错一场比赛的。

1.4串4是4场3关,即ABC、ABD、BCD、ACD。

2.如果4场比赛全中,那奖金是这4个串关的和。

3.如果错一场,比如A错了,那只能收获BCD这个组合的奖金。

4.4串5是4场3关,和一场4关。

即ABC、ABD、BCD、ACD、ABCD。

5.如果4场全中,不但可收获4场3关的奖金和,还能有一个4关的奖金。

二、比如买了一张彩票:A、B、C、D四场比赛,1.比如说是错了一场,4串4和4串5的奖金都是一样的。

2.但如果是4场比赛对了,那4串5比4串4的组合方式多出一个4关的奖金。

追答足球混合过关详解https://bit.ly/2M9HYaX我们是以6人至的球员规则来比赛。

在比赛开始前,队长曾煜凡开口了,“这场比赛我们尽量防守,将中锋全部调到后方来防守。

下半场再进攻,但是防守队员也要有三个。

”5分钟后,开球了,我队球员一个个绷着脸,但是这并没有挡住1班的挑衅,这让作为后卫的我不由得打了一个寒战。

1班见挑衅起作用了,便发起了新一轮的攻势,对方一连过了我方3、4名队员,眼看就要到球门前了,我方前锋才急匆匆地赶回来防守,脸上流露出责备的表情。

吡——球进了。

对方欣喜万分,而我方却是气急败坏。

守门员呆立在那里,似乎不相信球那么快就进了。

我方大怒,全力进攻。

队长曾煜凡沉着地指挥着战斗。

终于到门前了!前锋郑建业脸一沉,大吼了一声再用力一抽,球碰的一声射进了门里。

我方拉拉队立刻沸腾起来。

我们也流露出胜利的喜悦。

我们乘胜追击,一连打了个6:1!我方士气越来越旺,但这是在心中的,我们只是把脸绷得紧紧的,不让对方看出我们骄傲。

1班又开始“扫荡”了,因为骄傲使我方的防御松垮了许多,使1班一连进了3个球,使比分成了7:4。

但是拉拉队是我方信心大增,于是我这个后卫也露了一手。

比分成了8:4,于是上半场就结束了。

下半场更精彩,因为有紧张刺激的点球大战。

第4章 串

第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比较大小的算法。

4 串

4  串

第四章串一、选择题1 串是一种特殊的线性表,其特征体现在。

A 可以顺序存储B 数据元素是一个字符C 可以链接存储D 数据元素可以使多个字符2 设有两个串p和q,求q在p中首次出现的位置的运算称作。

A 连接B 模式匹配C 求串长D 求子串3 设字符串S1=“ABCDEFG”,S2=“PQRST”,则运算:S=CONCAT(SUBSTR(S1,2,LEN(S2));SUBSTR(S1,LEN(S2),2));后的串值为。

A A BCDEFB BCDEFGC BCDPQRSTD BCDEFER二、判断题1 空格串和孔串的长度均为1。

( )2 串是一种特殊的线性表,其特殊性体现在数据元素可以使多个字符。

( )3 判断两个串是否相等,只需要判断这两个串是否包含相同的字符即可。

( )三、简答题:1 设S1 =“Data Structure Course”,S2 =“Structure”,S3 =“Base”,求:(1)Length(S1);(2)Compare(S2, S3);(3)Insert(S1, 5, S3);(4)Delete(S1, 5, 9);(5)SubString(S1, 5, 9, T);(6)Search(S1, 0, S2);(7)Replace(S1, 0, S2, S3) 2什么叫串?串和字符在存储方法上有什么不同?空串和空格串是否相同,为什么?3 串是由字符组成的,长度为1的串和字符是否相同。

为什么?4串是不定长的,表示串的长度有几种方法?C语言中的串采用哪种方法?5 可以说串是数据类型固定为字符类型的线性表,但是串操作和线性表操作的主要不同之处在哪里?6 可以用几种存储方法存储串?7分别写出串的静态数组存储结构和串的动态数组存储结构的结构体定义。

8 为什么动态数组结构下串的实现要增加撤消函数?9 令t1=“aaab”, t2=“abcabaa”, t3=“abcaabbabcabaacba”,试分别求出他们的next[j]值。

4 串联电路和并联电路

4   串联电路和并联电路

(2)电压:串联电路中,总电压等于各部分电路电压 之和 ,写成表达式
(3)电阻:串联电路中,总电阻等于各部分电路电阻 之和 .
知识必备
知识点二
并联电路 ,
1.并联电路:如图2-4-2所示,把几个导体一端连在一起,另一端也 连在一起 然后把这两端接入电路,这样的连接方式叫并联.
图 2 -4 -2
知识必备
外接法
电压表示数 UV=UR, 电流表示数 IA=IR+IV>IR, R 测= ������ < R =R 真
U I ������ U IR
误差分析
UA>UR,电流表示数 IA=IR,R 测= ������ > R =R 真
U I ������ U IR
学习互动
(续表)
内接法
外接法
误差来源
电流表的分压作用
学习互动
[答案]AC [解析] 当 c、d 端用导线连接时,R2 与 R3 的并联电阻为 30 Ω,再与 R1 串联,a、b 间等 效电阻为 40 Ω,选项 A 正确;当 a、b 端用导线连接时,R1 与 R3 的并联电阻为 8 Ω,再与 R2 串联,c、d 间等效电阻为 128 Ω,选项 B 错误;当 a、b 两端接测试电源时,电阻 R2 未 接入电路,c、d 两端的电压即为 R3 两端的电压,Ucd= ×100 V=80 V,选项 C 正确;当 c、 d 两端接测试电源时,电阻 R1 未接入电路, a、b 两端的电压即为 R3 两端的 电压,Uab=
新课导入
续答:不是的.当其中一个灯泡烧毁后,只是坏的不亮,其余的照常发 光.原因是,当这个小灯泡烧坏的瞬间,220 V的电压就加在这个坏灯泡的两 端,而灯泡内的一个特殊装置将会被击穿导通变成导体,电路重新被接通.

4串

4串

4 串
5
串的基本运算:求子串
• 初始条件
– 串S存在,1≤i≤StrLen(S) 且0≤j≤StrLen(S)-i+1。
• 操作结果
– 返回串S的第i个字符起长度为j的子串。
• 例如:
– SubStr(commander, 4, 3) – 结果:man
4 串 6
串的基本运算:串定位
• 初始条件:
• 算法分析
– 最好的情况
•主串S和模式T中的每个字符都只访问了一次 •复杂度 = O(n + m)
i b b b b b a b c a c a b c a c j
4 串 46
串的模式匹配:简单算法
• 算法分析
– 最好的情况
•主串S和模式T中的每个字符都只访问了一次 •复杂度 = O(n + m)
1 2 3 4 5
j
4 串 35
i
1 2 3 4 5 6 7 8 9 10 11 12 13
a b a b c a b c a c b a b a b c a c
1 2 3 4 5
j
4 串 36
i
1 2 3 4 5 6 7 8 9 10 11 12 13
a b a b c a b c a c b a b a b c a c
1 2 3 4 5
j
4 串 33
i
1 2 3 4 5 6 7 8 9 10 11 12 13
a b a b c a b c a c b a b a b c a c
1 2 3 4 5
j
4 串 34
i
1 2 3 4 5 6 7 8 9 10 11 12 13
a b a b c a b c a c b a b a b c a c
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、填空题1、串的两种最基本的存储方式是、。

2、两个串相等的充分必要条件是。

3、空串是的串,其长度等于零。

4、空白串是的串,其长度等于。

5、组成串的数据元素只能是。

6、设S=”I AM A TEACHER”,(其中””表示一个空格字符)其长度是。

7、设S1=”GOOD”, S2=””, S3=”BYE!”, 则S1、S2、S3连接后的结果是。

8、设有两个串p和q,求q在p中首次出现的位置的运算称作。

9、有串s1=”ABCDEFG”,s2=”PQRST”,假设函数con(x,y)返回x和y串的连接串,subs(s,i,j)返回串s的从序号i的字符开始的j个字符组成的子串,len(s)返回串s的长度,则con(subs(s1,2,len(s2)),subs(s1,len(s2),2))的结果串是。

10、INDEX(”DATASTRUCTURE”,”STR”)= 。

11、设有A=””,B=”mule”,C=”old”,D=”my”,请计算下面运算的结果:(1)strcat(A,B)=(2)strcat(B,A)=(3)strcat(strcat(D,C),B)=(4)substr(B,3,2)=(5)substr(C,1,0)=(6)strlen(A)=(7)strlen(D)=(8)index(B,D)=(9)index(C,”d”)=(10) insert(D,2,C)=(11) insert(B,1,A)=(12) delete(B,2,2)=(13) delete(B,2,0)=(14) replace(C,2,2,”k”)=二、编程题1.采用顺序结构存储串,编写一个函数计算一个子串在一个字符串中出现的次数,如果该子串不出现则为0。

2.设s、t为两个字符串,分别放在两个一维数组中,m、n分别为其长度,判断t是否为s 的子串。

如果是,输出子串所在位置(第一个字符),否则输出0。

int index(char s[],t[],int m,n)3.输入一个字符串,内有数字和非数字字符,如:ak123x456 17960?302gef4563,将其中连续的数字作为一个整体,依次存放到一数组a中,例如123放入a[0],456放入a[1],……。

编程统计其共有多少个整数,并输出这些数。

int CountInt()4.函数void insert(char*s,char*t,int pos)将字符串t插入到字符串s中,插入位置为pos。

请用c语言实现该函数。

假设分配给字符串s的空间足够让字符串t插入。

(说明:不得使用任何库函数)void insert(char *s,char *t,int pos)5.编写算法,从串s中删除所有和串t相同的子串。

int SubString_Delete(Stringtype &s,Stringtype t)//从串s中删除所有与t相同的子串,并返回删除次数第四章答案一、填空题1、顺序存储方式链式存储方式2、长度相等对应位置的字符相同3、零个字符零4、由一个或多个空格字符组成的串其包含的空格个数5、字符6、147、”GOOD BYE!”8、模式匹配9、BCDEFEF10、511、(1)” mule”(2)” mule ”(3)”myoldmule”(4)”le”(5)””(6)0(7) 2(8)0(9) 3(10)”myold”(11)”m ule”(12)”me”(13)”mule”(14)”ok”二、编程题1.int str_count(Sstring *substr,Sstring *str) {int i=0,j,k,count=0;for(i=0;str->data[i];i++){for(j=i,k=0;(str->data[j]==substr->data[k]) ; j++,k++);if(k==substr->len-1)count++;}return(count);}2.解:[题目分析]判断字符串t是否是字符串s的子串,称为串的模式匹配,其基本思想是对串s和t各设一个指针i和j,i的值域是0..m-n,j的值域是0..n-1。

初始值i和j均为0。

模式匹配从s0和t0开始,若s0=t0,则i和j指针增加1,若在某个位置si!=tj,则主串指针i回溯到i=i-j+1,j仍从0开始,进行下一轮的比较,直到匹配成功(j>n-1),返回子串在主串的位置(i-j)。

否则,当i>m-n则为匹配失败。

int index(char s[],t[],int m,n)//字符串s和t用一维数组存储,其长度分别为m和n。

本算法求字符串t在字符串s中的第一次出现,如是,输出子串在s中的位置,否则输出0。

{int i=0,j=0;while (i<=m-n && j<=n-1)if (s[i]==t[j]){i++;j++;} //对应字符相等,指针后移。

else {i=i-j+1;j=0;} //对应字符不相等,I回溯,j仍为0。

if(i<=m-n && j==n) {printf(“t在s串中位置是%d”,i-n+1);return(i-n+1);}//匹配成功else return(0); //匹配失败}//算法index结束main ()//主函数{char s[],t[]; int m,n,i;scanf(“%d%d”,&m,&n); //输入两字符串的长度scanf(“%s”,s); //输入主串scanf(“%s”,t); //输入子串i=index(s,t,m,n);}//程序结束[程序讨论]因用C语言实现,一维数组的下标从0开始,m-1是主串最后一个字符的下标,n-1是t串的最后一个字符的下标。

若匹配成功,最佳情况是s串的第0到第n-1个字符与t匹配,时间复杂度为o(n);匹配成功的最差情况是,每次均在t的最后一个字符才失败,直到s串的第m-n个字符成功,其时间复杂度为o((m-n)*n),即o(m*n)。

失败的情况是s串的第m-n个字符比t串某字符比较失败,时间复杂度为o(m*n)。

之所以串s的指针i 最大到m-n,是因为在m-n之后,所剩子串长度已经小于子串长度n,故不必再去比较。

算法中未讨论输入错误(如s串长小于t串长)。

另外,根据子串的定义,返回值i-n+1是子串在主串中的位置,子串在主串中的下标是i-n。

3.解:[问题分析]在一个字符串内,统计含多少整数的问题,核心是如何将数从字符串中分离出来。

从左到右扫描字符串,初次碰到数字字符时,作为一个整数的开始。

然后进行拼数,即将连续出现的数字字符拼成一个整数,直到碰到非数字字符为止,一个整数拼完,存入数组,再准备下一整数,如此下去,直至整个字符串扫描到结束。

int CountInt()// 从键盘输入字符串,连续的数字字符算作一个整数,统计其中整数的个数。

{int i=0,a[]; // 整数存储到数组a,i记整数个数scanf(“%c”,&ch);// 从左到右读入字符串while(ch!=‘#’) //‘#’是字符串结束标记if(isdigit(ch))// 是数字字符{num=0; // 数初始化while(isdigit(ch)&& ch!=‘#’)// 拼数{num=num*10+‘ch’-‘0’;scanf(“%c”,&ch);}a[i]=num;i++;if(ch!=‘#’)scanf(“%c”,&ch); // 若拼数中输入了‘#’,则不再输入}// 结束while(ch!=‘#’)printf(“共有%d个整数,它们是:”i);for(j=0;j<i;j++){printf(“%6d”,a[j]);if((j+1)%10==0)printf(“\n”);} // 每10个数输出在一行上}// 算法结束[算法讨论]假定字符串中的数均不超过32767,否则,需用长整型数组及变量。

4.解:[题目分析]本题是字符串的插入问题,要求在字符串s的pos位置,插入字符串t。

首先应查找字符串s的pos位置,将第pos个字符到字符串s尾的子串向后移动字符串t的长度,然后将字符串t复制到字符串s的第pos位置后。

对插入位置pos要验证其合法性,小于1或大于串s的长度均为非法,因题目假设给字符串s的空间足够大,故对插入不必判溢出。

void insert(char *s,char *t,int pos)//将字符串t插入字符串s的第pos个位置。

{int i=1,x=0; char *p=s,*q=t; //p,q分别为字符串s和t的工作指针if(pos<1) {printf(“pos参数位置非法\n”);exit(0);}while(*p!=’\0’&&i<pos) {p++;i++;} //查pos位置//若pos小于串s长度,则查到pos位置时,i=pos。

if(*p == '/0') {printf("%d位置大于字符串s的长度",pos);exit(0);}else //查找字符串的尾while(*p!= '/0') {p++; i++;} //查到尾时,i为字符‘\0’的下标,p也指向‘\0’。

while(*q!= '\0') {q++; x++; } //查找字符串t的长度x,循环结束时q指向'\0'。

for(j=i;j>=pos ;j--){*(p+x)=*p; p--;}//串s的pos后的子串右移,空出串t的位置。

q--; //指针q回退到串t的最后一个字符for(j=1;j<=x;j++) *p--=*q--; //将t串插入到s的pos位置上[算法讨论] 串s的结束标记('\0')也后移了,而串t的结尾标记不应插入到s中。

6.解:.[题目分析]两个串的相等,其定义为两个串的值相等,即串长相等,且对应字符相等是两个串相等的充分必要条件。

因此,首先比较串长,在串长相等的前提下,再比较对应字符是否相等。

int equal(strtp s,strtp t)//本算法判断字符串s和字符串t是否相等,如相等返回1,否则返回0{if (s.curlen!=t.curlen) return (0);for (i=0; i<s.curlen;i++) //在类C中,一维数组下标从零开始if (s.ch[i]!= t.ch[i])return (0);return (1); //两串相等}//算法结束5.{for(n=0,i=1;i<=s[0]-t[0]+1;i++){for(j=1;j<=t[0]&&s[i+j-1]==t[i];j++);if(j>m) //找到了与t匹配的子串{for(k=i;k<=s[0]-t[0];k++) s[k]=s[k+t[0]]; //左移删除s[0]-=t[0];n++;}}//forreturn n;}//Delete_SubString。

相关文档
最新文档