数据结构-串
数据结构中的串
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种操作 首页 上页 下页 退出 们不能通过其它串操作实现。 们不能通过其它串操作实现。
数据结构串、数组和广义表知识点总结
数据结构串、数组和广义表知识点总结
数据结构是计算机科学中研究数据如何组织、存储、管理和操作的学科。
三个常见的数据结构串、数组和广义表都是用于存储和操作数据的。
1. 串:
- 串是由0个或多个字符组成的有限序列。
它是一维数组的特例。
- 串的操作包括插入、删除、修改和查找等常见操作。
- 串可以通过数组、链表或动态分配的内存来实现。
2. 数组:
- 数组是一种线性数据结构,它由一组连续的内存空间组成,
存储相同类型的数据。
- 数组的操作包括插入、删除、修改和查找等常见操作。
- 数组的访问时间复杂度为O(1),但插入和删除的时间复杂度
较高。
3. 广义表:
- 广义表是由若干元素组成的有序集合,每个元素可以是原子
或者是一个广义表。
- 广义表可以通过链表来实现,每个节点包含两个指针,一个
指向元素,一个指向下一个节点。
- 广义表的操作包括插入、删除、修改和查找等常见操作。
- 广义表可以表示任意层次的嵌套结构,具有灵活性和扩展性。
总结:
- 串、数组和广义表都是常见的数据结构,用于存储和操作数据。
- 串是字符的有限序列,可以通过数组或链表来实现。
- 数组是一维线性数据结构,存储相同类型的数据,具有常数时间复杂度的访问操作。
- 广义表是由元素组成的有序集合,可以通过链表来实现,能够表示任意层次的嵌套结构。
数据结构——第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; }
数据结构 串 实验报告
实验报告实验名称:串实验目的:(1)、熟悉C语言的上机环境,进一步掌握C语言的结构特点;(2)、掌握串的定义及C语言实现;(3)、掌握串的模式匹配及C语言实现;(4)、掌握串的各种基本操作;实验步骤:(1)、建立链串类型(2)、实现匹配过程中需考虑的链表的特征。
实验内容:4.一个字符串中的任意一个子序列,若子序列中各字符值均相同,则成为字符平台。
写一算法,输入任意以字符串S,输出S中长度最大的所有字符平台的起始位置及所含字符。
注意,最大字符平台有可能不止一个。
实验数据记录:(源代码及执行过程)#include<stdio.h>#include<stdlib.h>#define Maxsize 20#define n 100typedef struct Node{int element[Maxsize];int front;int rear;}Queue;int EnterQueue(Queue *Q,int x){if((Q->rear+1)%Maxsize == Q->front){printf("队列已满!\n");return 0;}Q->element[Q->rear] = x;Q->rear = (Q->rear+1)%Maxsize;return 1;}int DeleQueue(Queue *Q,int *x){if(Q->front == Q->rear){printf("队列为空!\n");return 0;}*x = Q->element[Q->front];Q->front = (Q->front+1)%Maxsize;return 1;}int Donull(Queue *Q){while(Q->front != Q->rear){Q->element[Q->front] = 0;Q->front = (Q->front+1)%Maxsize;}Q->front = Q->rear = 0;if(Q->front == Q->rear){return 1;}else{return 0;}}int main(void){char str[n];int i=0,j=1,k=1,ch,p=1,flag=1;Queue *Q;Q = (Queue *)malloc(sizeof(Queue));Q->front = Q->rear = 0;printf("请输入字符串:");gets(str);while('\0' != *(str+i)){ while(*(str+i+1) == *(str+i)){if(flag){p = i;flag = 0;}i++;j++;}if(flag){p = i;}if(j >= k){if(j > k){Donull(Q);k = j;}if(EnterQueue(Q ,j) == 0)break;if(EnterQueue(Q,p+1) == 0)break;if(EnterQueue(Q,*(str+i)) == 0)break;}j=1;i++;flag = 1;} while(Q->front < Q->rear){DeleQueue(Q,&j);DeleQueue(Q,&k);DeleQueue(Q,&ch);printf("%-10d",k);for(i = 0; i < j; i++){printf("%c",ch);}printf("\n");}printf("\n");system("pause");}。
数据结构第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)代表单个字符,可以是字母、 数字或其它字符(包括空白符)。 串值:双引号括起来的字符序列。双引号不是 串的内容,只起标识作用。
数据结构中的串
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章 串
数据结构的串操作
数据结构的串操作数据结构的串操作
⒈概述
⑴串的定义
⑵串的基本操作
⒉串的存储结构
⑴顺序存储结构
⑵链式存储结构
⒊串的基本操作
⑴串的长度
⑵串的比较
⑶串的连接
⑷串的截取
⑸串的插入
⑹串的删除
⑺串的替换
⒋字符串匹配算法
⑴朴素模式匹配算法
⑵ KMP 算法
⑶ Boyer-Moore 算法
⑷ Rabin-Karp 算法
附件:
⒈示例代码
⒉数据集
法律名词及注释:
⒈串:在计算机科学中,串(String)是由零个或多个字符组成的有限序列。
⒉顺序存储结构:串的顺序存储结构是将串的字符按线性次序逐个存储在一组地址连续的存储单元里。
⒊链式存储结构:串的链式存储结构是通过定义一个节点类型来存储串的字符,每个节点包含一个字符和一个指向下一个节点的指针。
⒋朴素模式匹配算法:朴素模式匹配算法是最简单的字符串匹
配算法之一,通过对目标串的每个字符依次与模式串进行比较,直
到找到匹配的位置或遍历完所有字符。
⒌ KMP 算法:KMP 算法是一种高效的字符串匹配算法,通过利
用模式串的前缀和后缀信息,在匹配失败时将模式串移动比朴素算
法更远的位置,减少比较次数。
⒍ Boyer-Moore 算法:Boyer-Moore 算法是一种基于多种规则
的字符串匹配算法,通过从右到左比较模式串和目标串的字符,根
据不匹配字符在模式串中的位置和字符表进行移动,提高匹配效率。
⒎ Rabin-Karp 算法:Rabin-Karp 算法是一种利用哈希函数的
字符串匹配算法,通过计算目标串和模式串的哈希值,并逐个比较,减少比较次数。
数据结构——串
7
三、串的基本操作 C语言中常用的串运算 定义下列几个变量: char s1[20]=“dirtreeformat”,s2[20]=“file.mem”; char s3[30],*p; int result;
(1) 求串长(length) int strlen(char s); //求串的长度
例如:printf(“%d”,strlen(s1)); 输出13
char strcat(char s1 , char s2)
该函数将串s2复制到串s1的末尾,并且返回一 个指向串s1的开始处的指针。
例如:strcat(a3,”/”)
strcat(a3,a2);
2020//4//a143=“dirtreeformat/file.mem”
9
(4)串比较(compare)
A=“This is a string” B=“is” B在A中出现了两次,其中首次出现所对应的主串
位置是3。因此,称B在A中的序号(或位置)为3 特别地,空串是任意串的子串,任意串是其自身的子
串。
2020/4/14
5
二、串的抽象数据定义
• ADT String { • 数据对象:D={ai| ai
16
顺序串的类型定义和顺序表类似: typedef char ElemType;
typedef struct { ElemType ch[maxstrlen]; int length;
}sstring; //其优点是涉及到串长操作时速度快。
2020/4/14
17
4.2.2 堆分配存储表示
这种存储表示的特点是,仍以一组地址连续的存储单元存 放字符串序列,但它们的存储空间是在程序执行过程中动态 分配而得。所以也称为动态存储分配的顺序表。在C语言中, 利用malloc和realloc,free等动态存储管理函数,来根据实 际需要动态分配和释放字符数组空间。这样定义的顺序串类
数据结构(串)
数据结构(串)数据结构(串)数据结构中的串(String)是由字符构成的有限序列。
在计算机科学中,串是一种基本的数据结构,被广泛应用于字符串处理、文本搜索、模式匹配等领域。
1. 串的定义和基本操作串可以使用多种方式来定义和表示,常见的方式有:- 定长顺序存储表示:使用数组来存储串,数组的长度和最大串长相等,不足的部分用特定字符填充(通常用空格)。
- 堆分配存储表示:使用堆(动态内存分配区)来存储串,可以根据实际需要动态分配和释放串的存储空间。
- 串的块链存储表示:将串分成多个块,将每个块使用链表进行表示,将各块在一起组成完整的串。
串的基本操作包括:- 串的赋值:将一个串赋值给另一个串。
- 串的连接:将两个串按顺序连接成一个新的串。
- 串的比较:比较两个串的大小关系。
- 串的截取:从一个串中截取出一段子串。
- 串的插入:将一个串插入到另一个串的指定位置。
- 串的删除:删除一个串中指定位置的字符或一段子串。
- 串的替换:将一个串中指定位置的字符或一段子串替换成另一个串。
2. 串的匹配算法串的匹配是指在一个主串中查找一个模式串的过程。
常见的串匹配算法包括:- 朴素匹配算法:也称为暴力匹配算法,是最简单的匹配算法。
它从主串的第一个字符开始,与模式串逐个字符进行比较,若不匹配,则主串向后移动一位,直到找到匹配的子串或主串遍历完。
- KMP算法:即Knuth-Morris-Pratt算法,通过利用模式串自身的信息,减少字符的比较次数。
该算法具有线性时间复杂度,是一种高效的匹配算法。
- Boyer-Moore算法:基于模式串中的字符发生不匹配时的启发式策略,通过跳跃式地移动模式串,减少字符的比较次数,从而提高匹配效率。
3. 串的应用串作为一种基本的数据结构,在实际应用中具有广泛的用途,主要包括以下几个方面:- 字符串处理:串在文本编辑、编译器设计、语法分析、文件操作等方面都有广泛应用。
- 模式匹配:串的匹配算法常被用于字符串搜索、DNA序列分析、信息检索等领域。
数据结构串的实验报告
一、实验目的1. 理解串的定义、性质和操作;2. 掌握串的基本操作,如串的创建、复制、连接、求子串、求逆序、求长度等;3. 熟练运用串的常用算法,如串的模式匹配算法(如KMP算法);4. 培养编程能力和算法设计能力。
二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发环境:Visual Studio 2019三、实验内容1. 串的创建与初始化2. 串的复制3. 串的连接4. 串的求子串5. 串的求逆序6. 串的求长度7. 串的模式匹配算法(KMP算法)四、实验步骤1. 串的创建与初始化(1)创建一个串对象;(2)初始化串的长度;(3)初始化串的内容。
2. 串的复制(1)创建一个目标串对象;(2)使用复制构造函数将源串复制到目标串。
3. 串的连接(1)创建一个目标串对象;(2)使用连接函数将源串连接到目标串。
4. 串的求子串(1)创建一个目标串对象;(2)使用求子串函数从源串中提取子串。
5. 串的求逆序(1)创建一个目标串对象;(2)使用逆序函数将源串逆序。
6. 串的求长度(1)获取源串的长度。
7. 串的模式匹配算法(KMP算法)(1)创建一个模式串对象;(2)使用KMP算法在源串中查找模式串。
五、实验结果与分析1. 串的创建与初始化实验结果:成功创建了一个串对象,并初始化了其长度和内容。
2. 串的复制实验结果:成功将源串复制到目标串。
3. 串的连接实验结果:成功将源串连接到目标串。
4. 串的求子串实验结果:成功从源串中提取了子串。
5. 串的求逆序实验结果:成功将源串逆序。
6. 串的求长度实验结果:成功获取了源串的长度。
7. 串的模式匹配算法(KMP算法)实验结果:成功在源串中找到了模式串。
六、实验总结通过本次实验,我对串的定义、性质和操作有了更深入的了解,掌握了串的基本操作和常用算法。
在实验过程中,我遇到了一些问题,如KMP算法的编写和调试,但在老师和同学的指导下,我成功地解决了这些问题。
数据结构之串类型
数据结构之串类型 串的基本概念: 串(字符串):是零个或多个字符组成的有限序列。
记作: S=“a1a2a3…”,其中S是串名,ai(1≦i≦n)是单个,可以是字母、数字或其它字符。
串值:双引号括起来的字符序列是串值。
串长:串中所包含的字符个数称为该串的长度。
空串(空的字符串):长度为零的串称为空串,它不包含任何字符。
空格串(空⽩串):构成串的所有字符都是空格的串称为空⽩串。
注意:空串和空⽩串的不同,例如“ ”和“”分别表⽰长度为1的空⽩串和长度为0的空串。
⼦串(substring):串中任意个连续字符组成的⼦序列称为该串的⼦串,包含⼦串的串相应地称为主串。
⼦串的序号:将⼦串在主串中⾸次出现时的该⼦串的⾸字符对应在主串中的序号,称为⼦串在主串中的序号(或位置)。
特别地,空串是任意串的⼦串,任意串是其⾃⾝的⼦串。
串相等:如果两个串的串值相等(相同),称这两个串相等。
换⾔之,只有当两个串的长度相等,且各个对应位置的字符都相同时才相等。
通常在程序中使⽤的串可分为两种:串变量和串常量。
串的抽象数据类型定义: ADT String{ 数据对象:D = { ai|ai∈CharacterSet, i=1,2,…,n, n ≥0 } 数据关系:R = {<ai-1, ai>| ai-1, ai∈D, i=2,3,…,n } 基本操作: StrAssign(t , chars) 初始条件: chars是⼀个字符串常量。
操作结果:⽣成⼀个值为chars的串t 。
StrConcat(s, t) 初始条件:串s, t 已存在。
操作结果:将串t联结到串s后形成新串存放到s中。
StrLength(t) 初始条件:字符串t已存在。
操作结果:返回串t中的元素个数,称为串长。
SubString (s, pos, len, sub) 初始条件:串s, 已存在, 1≦pos≦StrLength(s)且 0≦len≦StrLength(s) –pos+1。
数据结构串的知识点归纳
数据结构串的知识点归纳数据结构串是一种线性表结构,它是由零个或多个数据元素组成的有限序列。
数据结构串的存储结构有两种:顺序存储结构和链式存储结构。
下面将从串的定义、顺序存储结构、链式存储结构、串的基本操作等几个方面进行详细介绍。
一、串的定义串是由零个或多个字符组成的有限序列。
在串中,字符的个数称为串的长度。
如果串的长度为0,则称为空串。
串中的字符可以是字母、数字、标点符号和其他特殊符号等。
二、顺序存储结构顺序存储结构是将串中的字符按照其在串中的顺序依次存放在一块连续的存储空间中。
在顺序存储结构中,我们可以使用一维数组来表示串。
数组的下标表示字符在串中的位置,数组的元素存储字符的ASCII码值或字符本身。
通过这种方式,我们可以方便地对串进行插入、删除、查找等操作。
三、链式存储结构链式存储结构是将串中的字符按照其在串中的顺序分别存放在一系列结点中,并通过指针将这些结点链接起来。
在链式存储结构中,我们可以使用单链表、双链表或循环链表等数据结构来表示串。
每个结点包含一个字符和一个指向下一个结点的指针。
通过这种方式,我们可以方便地对串进行插入、删除、查找等操作。
四、串的基本操作1. 串的赋值:将一个串赋值给另一个串,即将被赋值串的字符复制给另一个串。
2. 串的连接:将两个串连接成一个新串,即将一个串的字符依次复制到另一个串的后面。
3. 串的比较:比较两个串是否相等或大小关系。
4. 串的求子串:从一个串中截取一段连续的子串。
5. 串的插入:将一个串插入到另一个串的指定位置。
6. 串的删除:从一个串中删除指定位置的字符或一段连续的子串。
7. 串的替换:将一个串中的子串替换为另一个串。
8. 串的查找:在一个串中查找指定字符或子串的位置。
9. 串的长度:获取一个串的长度。
10. 串的清空:将一个串清空,使其变成空串。
五、应用场景串作为一种基本的数据结构,在实际应用中有着广泛的应用场景。
例如,字符串匹配算法中常用的KMP算法和Boyer-Moore算法,都是基于串的操作实现的。
数据结构-第四章串
数据结构-第四章串串也叫字符串,它是由零个或多个字符组成的字符序列。
基本内容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、掌握串的两种模式匹配算法:BF和KMP。
3、了解串的应用。
【实验学时】2学时【实验预习】回答以下问题:1、串和子串的定义串的定义:串是由零个或多个任意字符组成的有限序列。
子串的定义:串中任意连续字符组成的子序列称为该串的子串。
2、串的模式匹配串的模式匹配即子串定位是一种重要的串运算。
设s和t是给定的两个串,从主串s的第start个字符开始查找等于子串t的过程称为模式匹配,如果在S中找到等于t的子串,则称匹配成功,函数返回t在s中首次出现的存储位置(或序号);否则,匹配失败,返回0。
【实验内容和要求】1、按照要求完成程序exp4_1.c,实现串的相关操作。
调试并运行如下测试数据给出运行结果:•求“This is a boy”的串长;•比较”abc3”和“abcde“;表示空格•比较”english”和“student“;•比较”abc”和“abc“;•截取串”white”,起始2,长度2;•截取串”white”,起始1,长度7;•截取串”white”,起始6,长度2;•连接串”asddffgh”和”12344”;#include<stdio.h>#include<string.h>#define MAXSIZE 100#define ERROR 0#define OK 1/*串的定长顺序存储表示*/typedef struct{char data[MAXSIZE];int length;} SqString;int strInit(SqString *s);/*初始化串*/int strCreate(SqString *s); /*生成一个串*/int strLength(SqString *s); /*求串的长度*/int strCompare(SqString *s1,SqString *s2); /*两个串的比较*/int subString(SqString *sub,SqString *s,int pos,int len);/*求子串*/int strConcat(SqString *t,SqString *s1,SqString *s2);/*两个串的连接*//*初始化串*/int strInit(SqString *s){s->length=0;s->data[0]='\0';return OK;}/*strInit*//*生成一个串*/int strCreate(SqString *s){printf("input string :");gets(s->data);s->length=strlen(s->data);return OK;}/*strCreate*//*(1)---求串的长度*/int strLength(SqString *s){return s->length;}/*strLength*//*(2)---两个串的比较,S1>S2返回>0,s1<s2返回<0,s1==s2返回0*/int strCompare(SqString *s1,SqString *s2){int i;for(i=0;i<s1->length&&i<s2->length;i++){if(s1->data[i]>s2->data[i]){return 1;}if(s1->data[i]<s2->data[i]){return -1;}}return 0;}/*strCompare*//*(3)---求子串,sub为返回的子串,pos为子串的起始位置,len为子串的长度*/int subString(SqString *sub,SqString *s,int pos,int len) {int i;if(pos<1||pos>s->length||len<0||len>s->length-pos+1) {return ERROR;}sub->length=0;for(i=0;i<len;i++){sub->data[i]=s->data[i+pos-1];sub->length++;}sub->data[i]='\0';return OK;}/*subString*//*(4)---两个串连接,s2连接在s1后,连接后的结果串放在t中*/int strConcat(SqString *t,SqString *s1,SqString *s2){int i=0,j=0;while(i<s1->length){t->data[i]=s1->data[i];i++;}while(j<s2->length){t->data[i++]=s2->data[j++];}t->data[i]='\0';t->length=s1->length+s2->length;return OK;}/*strConcat*/int main(){int n,k,pos,len;SqString s,t,x;do{printf("\n ---String--- \n");printf(" 1. strLentgh\n");printf(" 2. strCompare\n");printf(" 3. subString\n");printf(" 4. strConcat\n");printf(" 0. EXIT\n");printf("\n ---String---\n");printf("\ninput choice:");scanf("%d",&n);getchar();switch(n){case 1:printf("\n***show strLength***\n");strCreate(&s);printf("strLength is %d\n",strLength(&s));break;case 2:printf("\n***show strCompare***\n");strCreate(&s);strCreate(&t);k=strCompare(&s,&t); /*(5)---调用串比较函数比较s,t*/if(k==0)printf("two string equal!\n");else if(k<0)printf("first string<second string!\n");elseprintf("first string>second string!\n");break;case 3:printf("\n***show subString***\n");strCreate(&s);printf("input substring pos,len:");scanf("%d,%d",&pos,&len);if(subString(&t,&s,pos,len))printf("subString is %s\n",t.data);elseprintf("pos or len ERROR!\n");break;case 4:printf("\n***show subConcat***\n");strCreate(&s);strCreate(&t);if(strConcat(&x,&s,&t)) /*(6)---调用串连接函数连接s&t*/printf("Concat string is %s",x.data);elseprintf("Concat ERROR!\n");break;case 0:exit(0);default:break;}}while(n);return 0;}2、按照要求完成程序exp4_2.c,实现BF&KMP串的模式匹配算法。
数据结构 第四章 串
第四章串串又称字符串,是一种特殊的线性表,它的每个元素仅由一个字符组成。
计算机上非数值处理的对象基本上是字符串数据。
在较早的程序设计语言中,字符串仅作为输入和输出的常量出现。
随着计算机应用的发展,在越来越多的程序设计语言中,字符串也可作为一种变量类型出现,并产生了一系列字符串的操作。
在信息检索系统、文字编辑程序、自然语言翻译系统等等应用中,都是以字符串数据作为处理对象的。
本章将讨论串的存储结构和基本操作。
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)。
相应的“串值复制”操作即可,需要时进行“截断”。
S1.len+S2.len MAXLEN 结果正确
串T 值
S1.len < MAXLEN
结果 S2 被“截断”
S1.len+S2.len > MAXLEN
S1.len == MAXLEN
结果 T=S1
String& Concat(String S1, String S2) { String T; if (S1.len+S2.len<= MAXLEN) // 未截断 { T.data[0...S1.len-1] = S1.data[0...S1.len-1]; T.data[S1.len...S1.len+S2.len-1] = S2.data[0...S2.len-1]; T.len= S1.len+S2.len; } else if (S1.len< MAXLEN) // 截断 { T.data[0...S1.len-1] = S1.data[0...S1.len-1]; T.data[S1.len...MAXLEN-1] = S2[0...MAXLEN-S1.len-1]; T.len = MAXSTRLEN; } else // 截断(仅取S1) { T.data[0...MAXLEN-1] = S.data[0...MAXLEN-1]; T.len = MAXLEN; } return T;
子串在主串中的位置:子串的首字符在主串中的位置。
例:S=“JINAN” S1=“” S2=“NA” S=“JINAN” — S 的子串。 在 S 中的位置:2 在 S 中的位置:0
空串是任意串的子串,任意串是其自身的子串。 S4=“JAN” —— 非 S 的子串
(非串 S 中的连续字符所组成)。 串相等的条件:当两个串的长度相等且各个对应 位置的字符都相等时才相等。
串的抽象数据类型的定义
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 是字符串常量。 操作结果:构造一个串值为 chars 的串。 StrCopy (&T, S) 初始条件:串 S 存在。 操作结果:由串 S 复制得串 T。
SubString( sub, commander , 0, 9)
求得 sub = commander
SubString( sub, commander , 8, 1)
求得 sub = r
SubString(sub, commander, 3, 7) sub = ?
SubString(sub, beijing, 6, 2) = ? sub = ?
作用:避免字符串与变量名或数的常量混淆。
作用:避免字符串与变量名或数的常量混淆。
例:x = “123” test =“test”
x = 123
空串:不含任何字符的串,长度 = 0,用符号 表示。
空格串:仅由一个或多个空格组成的串。 子串:由串中任意个连续的字符组成的子序列。 主串:包含子串的串。 位置:字符在序列中的序号。
Replace (&S, T, V) 而不是 “abbcaca”。 初始条件:串 S、T 和 V 存在,T 是非空串。 操作结果:用 V 替换主串 S 中出现的所有与 T 相等 的不重叠的子串。
} ADT String
子串为“串”中的一个字符子序列 例如:
SubString( sub, commander , 3, 3) 求得 sub = man ;
}
String& String::Concat(String &s1, String &s2) { delete [ ]strval;
strval = new char[s1.slen + s2.slen + 1]; // 分配存储空间 strcpy(strval, s1.strval);// 复制第一个串 strcat(strval, s2.strval); // 连接第二个串 slen = s1.slen+s2.slen; // 串赋值 return *this; }
4.3 串的模式匹配算法
设有主串s和子串t,子串t的定位就是要在 主串s中找到一个与子串t相等的子串。通常 把主串s称为目标串,把子串t称为模式串,因此 定位也称作模式匹配。模式匹配成功是指在 目标串s中找到一个模式串t;不成功则指目 标串s中不存在模式串t。
4.3.1 简单算法
从目标串s="s0s1…sn-1"的第一个字符开始 和模式串t="t0t1…tm-1"中的第一个字符比较, 若相等,则继续逐个比较后续字符;否则从目 标串s的第二个字符开始重新与模式串t的第一 个字符进行比较。依次类推,若从模式串s的第i 个字符开始,每个字符依次和目标串t中的对应 字符相等,则匹配成功,该算法返回i;否则,匹 配失败,函数返回-1。
第 3 次匹配
s=cddcdc t=cdc
i=2 失败
j=0
第 4 次匹配
s=cddcdc t=cdc
unsigned char data[MAXLEN ]; int len; //串的长度 public: …….. };
串的实际长度可在这个预定义长度的范围内 随意设定,超过预定义长度的串值则被舍去,称 之为“截断”。
定长顺序存储表示时串的操作的实现
1、串连接 Concat(&T, S1, S2) 假设串 T 是由串 S1 连结串 S2 得到的,则只要进行
StrCompare (S, T) 初始条件:串 S 和 T 存在。 操作结果:若 S > T,则返回值 > 0; 若 S = T,则返回值 = 0; 若 S < T,则返回值 < 0。
StrLength (S) 初始条件:串 S 存在。 操作结果:返回 S 的元素个数,称为串的长度。
Concat (&T, S1, S2) 初始条件:串 S1 和 S2 存在。 操作结果:用 T 返回由 S1 和 S2 连接而成的新串。
String::String( ) // 操作结果:初始化串
{ slen = 0;
// 串长度为0
strval = NULL; // 空串
}
String::~String( )
// 操作结果:销毁串,释放串所占用空间
{
delete [ ]strval; // 释放串strval
}
String::String(const char *copy)
堆存储结构的优点:堆存储结构既有顺序 存储结构的特点,处理(随机取子串)方便, 操作中对串长又没有任何限制,更显灵活,因 此在串处理的应用程序中常被采用。
堆分配存储表示为高级程序设计语言所采用。
4.2.3 串的块链存储表示
串值也可用单链表存储,称为链串。 链串与单链 表的差异只是它的结点数据域为单个字符。
起始位置和子串长度之间存在约束关系
SubString(student, 5, 0) =
长度为 0 的子串为“合法”串
“子串在主串中的位置”意指子串 中的第一个字符在主串中的位序。
假设 S = abcaabcaaabc , T = bca Index(S, T, 0) = 1; Index(S, T, 3) = 5; Index(S, T, 8) = 0;
} // Concat
定长顺序存储表示时串操作的缺点 1、需事先预定义串的最大长度,这在程序运 行前是很难估计的。 2、由于定义了串的最大长度,使得串的某 些操作受限(截尾),如串的连接、插入、 置换等运算。 克服办法:不限定最大长度
——动态分配串值的存储空间。
4.2.2 堆分配存储表示
堆存储结构的特点: class String
Chapter 4 String
教学内容
1、 串的定义 2、 串的存储表示 3、 串的模式匹配算法
4.1 串的定义
基本概念
串(字符串):是由 0 个或多个字符组成的
有限序列。
记为:s =“ a1 a2 a3 … ai …an ” ( n≥0 )。
串的名
串的值
串的长度
必须有! 字母、数字或其他字符
4.2 串的存储表示
因为串是特殊的线性表,故其存储结构 与线性表的存储结构类似,只不过组成串的 结点是单个字符。
4.2.1 定长顺序存储表示
定长顺序存储表示,也称为静态存储分配 的顺序串。即用一组地址连续的存储单元依次 存放串中的字符序列。
#define MAXLEN 255 class String { protected:
SubString (&Sub, S, pos, len) 初始条件:串 S 存在,0≤pos≤StrLength(S)-1 且 0≤len≤StrLength(S) – pos。 操作结果:用 Sub 返回串 S 的第 pos 个字符起长度 为 len 的子串。
Index (S, T, pos) 初始条件:串 S 和 T 存在,T 是非空串, 0≤pos≤S假tr设LeSn=g“thab(Sc)a-c1a。bcaca”, 操作结果:若主串 ST中=“存ab在ca和” ,串 VT=值“a相b”同,的子串, 则返回它则在置主换串之S后中的第 pos 个字符之后 第一次出S现=“的ab位ca置bc;a”否,则函数值为 0。
仍以一组空间足够大的 { protected:
地址连续的存储单元依 char *strval;