数据结构(C语言版)第4章 串

合集下载

算法与数据结构c语言版第4章串

算法与数据结构c语言版第4章串

详细描述
在C语言中,可以使用str_replace()函数来替换字符串 中的子串。该函数接受三个参数,第一个参数是源字 符串,第二个参数是要被替换的子串,第三个参数是 替换后的子串。str_replace()函数将源字符串中所有 出现的指定子串替换为新的子串,并返回替换后的新 字符串。需要注意的是,该函数不是标准C库中的函 数,需要引入额外的头文件或使用第三方库来实现。
char *tmp; // 临时变量,用 于临时存储替换过程中的字符串
片段
int len_rep; // 要被替换的子 串的长度
字符串的替换
int len_with; // 替换后的子串的长度
int count; // 替换次数(用于循环)
int len_front; // 前面的字符串长度 (每次替换前需要保留的部分)
字符串的连接
示例代码 ```c
char source1[] = "Hello, ";
字符串的连接
char source2[] = "world!"; char destination[20]; strcat(destination, source1);
字符串的连接
strcat(destination, source2); ```
字符串的比较
01
示例代码
02
```c
char str1[] = "Hello";
03
字符串的比较
1
char str2[] = "World";
2
int result = strcmp(str1, str2);
```
3
字符串的替换

严蔚敏《数据结构(c语言版)习题集》答案第四章 串

严蔚敏《数据结构(c语言版)习题集》答案第四章 串
《一定能摸到红球吗?》说课稿
林银花
一、教材说明:
1、 课题:《一定能摸到红球吗?》
2、 本节内容的地位和作用
在现代社会中,人们面临着更多的机会和选择,常常需要在不确定情境中作出合理的决策,概率正是通过对不确定现象和事件发生的可能性的刻画,来为人们更好的制定决策提供依据和建议.本节内容又是义务教育阶段,唯一培养学生从不确定的角度来观察世界的数学内容,让学生了解可能性是普遍的,有助于他们理解社会,适应生活.
(1) 每位同学从盒子中轮流摸球,记录下所摸球的颜色,并将球放回盒中.
(2) 做10次这样的活动,将最终结果填在表中.
(3) 全班将各小组活动进行汇总,摸到红球的次数是多少?摸到黄球的次数是多少?他们各占总数的百分比是多少?
(4) 你认为哪种颜色的球多?打开看一看.
(5) 如果从盒中任意摸出一球,你认为摸到哪种颜色的球可能性大? 学生阅读学习目标.
学生两人一组进行活动.一人摸一人记录.并交流.
题(1):学生先想象后画图,并通过搭建几何体验证学习成果。
题(2):学生四人一组进行活动,一人搭几何体,另三人画图并交流,如有异义,举手询问。依次轮流。 使学生明确学习目标,进入学习角色,做到有的放矢。
目的是使学生体会到进行概率试验时,一定要保证随机性.
课堂组织策略:创设贴近学生生活,生动有趣的问题情境,开展活泼、主动、有效的数学活动,组织学生主动参与、勤于动手、积极思考,使他们在自主探索和合作交流的过程中真正理解和掌握概率有关内容。
学生学习策略:明确学习目标,了解所需掌握的知识,在教师的组织、引导、点拨下主动地从事观察、试验、猜测、验证与交流等数学活动,从而真正有效地理解和掌握知识。
(3)、情感目标:

《数据结构与算法(C++语言版)》第4章_串

《数据结构与算法(C++语言版)》第4章_串

串函数与串的类定义
• 常用的 常用的C++串函数 串函数 • C++的串库(string.h)中提供了许多字符串的操作函数,几 个常用的C++字符串函数及其使用方法如下。 •假设已有以下定义语句:
串函数与串的类定义
• (1)串拷贝函数 • char *strcpy(char *s1, const char *s2),将字符串s2复制到字 符串数组s1中,返回s1的值。 • char *strncpy(char *s1, const char *s2, size_tn)将字符串s2中最 多n个字符复制到字符串数组s1中,返回s1的值。 • 例如:
串函数与串的类定义
• (3)串比较函数 • int strcmp(const char *s1, const char *s2),比较字符串s1和字 符串s2。函数在s1等于、小于或大于s2时,分别返回0、小 于0或者大于0的值。 • int strncmp(const char *s1, const char *s2, size_tn)比较字符串 s1中的n个字符和字符串s2。函数在s1等于、小于或大于s2 时,分别返回0、小于0或者大于0的值。 • 例如:
串模式匹配
• 无回溯的匹配算法 • 在上面介绍的匹配算法中,某趟匹配失败时,下一趟的匹 配相当于将子串P后移1位再从头与主串中对应字符进行比 较,即相当于i指示器回溯到上趟(最近失败的一趟)匹配 的起点的下一个位置,这样,主串中每个字符都要与子串 中的第1个字符对应一次,再向后比较。因此,主串中每个 字符参加比较的次数最多可达n次(n为子串长度),因此 时间复杂度为O(nm)。那么,能否使目标串中每个字符只参 加一次比较呢?也就是说,能否不回溯i指示器?回答是肯 定的。这个问题是由D.E.Knoth与V.R.Pratt和J.H.Morris同时 解决的,所以有的文献也称这种思想的串匹配算法为KMP 算法。

数据结构4-串

数据结构4-串
// 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 ; else return i ; } // while } // if return 0; // S中不存在与T相等的子串 } // Index
4
v v
串是一种特殊的线性表 串与一般线性表的区别:
™ 串的数据元素约束为字符集; ™ 串的基本操作通常针对串的整体或串的一个部分进行。
v
为何要单独讨论“串”类型?
™ 字符串操作比其他数据类型更复杂(如拷贝、连接操作) ™ 程序设计中,处理对象很多都是串类型。
5
串的抽象数据类型定义
ADT String{ 数据对象:D={ai|ai∈CharacterSet,i=1,2,…,n;n≥0} 数据关系:S={< ai-1 , ai >| ai-1, ai ∈D, i = 2,…,n} 基本操作: StrAssign(&T,chars) StrLength(S) SubString(&Sub,S,pos,len) StrCopy(&T,S) StrCompare(S,T) Concat(&T,S1,S2) Index(S,T,pos) StrEmpty(S) Replace(&S,T,V) StrInsert(&S,pos,T) StrDelete(&S,pos,len) ……

数据结构——第4章 串(C#)

数据结构——第4章 串(C#)
将当前链串的所有结点?nstr将q结点插入到尾部将q结点插入到尾部将链串t的所有结点?nstr将q结点插入到尾部尾结点的next置为null返回新建的链串5求子串substrij返回当前串中从第i个字符开始的连续j个字符组成的子串ຫໍສະໝຸດ 第4章 串4.1 串的基本概念
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章  串
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;

数据结构(C语言版)第4章串

数据结构(C语言版)第4章串

第4章串串:限定数据元素类型的线性表。

1 逻辑结构1.1 定义位串:数据元素属于{0,1}ASCII码串: 数据元素属于ASCII码字符集。

数字串:数据元素属于整数集合2 顺序串///////////////////////////////// // 项目路径:7动态顺序串/////////////////////////////////2.2 构造/析构(测试函数Test1)template <class T>String<T>:: String( ){ m_Data=NULL; m_Size=m_Length=0; }template <class T>String<T>::String(T a[], int n){ m_Size = m_Length = n;m_Data = new T[m_Size];if(!m_Data) throw "内存不够,上溢";for(int i=0; i<m_Length; i++)m_Data[i]=a[i];}template <class T>String<T>::String(String &s) // 拷贝构造函数{ m_Size = m_Length = s.m_Length;m_Data = new T[m_Size];if(!m_Data) throw "内存不够,上溢";for(int i=0; i<m_Length; i++)m_Data[i]=s.m_Data[i];}template <class T>String<T>:: ~String( ){ delete []m_Data; }2.3 比较(测试函数Test2)// 重载<template <class T>bool String<T>::operator<(String &s){ for(int i=0; i<m_Length && i<s.m_Length; i++) { if(m_Data[i]<s.m_Data[i]) return true;if(m_Data[i]>s.m_Data[i]) return false;}if(m_Length<s.m_Length) return true;return false;}// 重载==template <class T>bool String<T>::operator==(String &s){ for(int i=0; i<m_Length && i<s.m_Length; i++) if(m_Data[i]!=s.m_Data[i]) return false; if(m_Length==s.m_Length) return true;return false;}2.4 取子串、连接(测试函数Test3)// 取子串template <class T>String<T> String<T>::Substr(int pos,int len) { if(pos+len>m_Length) // 预防子串长度越界len=m_Length-pos;String<T> s;s.m_Length=s.m_Size=len;s.m_Data = new T[s.m_Size];if(!s.m_Data) throw "内存不够,上溢";for(int i=0; i<len; i++)s.m_Data[i]=m_Data[pos+i];return s;}// 连接stemplate <class T>void String<T>::Concat(String s){ if(m_Length+s.m_Length > m_Size) // 空间不够ReNew(m_Length+s.m_Length);for(int i=0; i<s.m_Length; i++)m_Data[m_Length+i] = s.m_Data[i];m_Length += s.m_Length;}// 重新分配串的存储空间template <class T>void String<T>::ReNew(int size){ T *p=new T[size]; // 重新申请空间 m_Size=size;for(int i=0; i<m_Length; i++) // 数据迁移p[i]=m_Data[i];delete []m_Data; // 释放原串空间 m_Data = p;}2.5 插入、删除(测试函数Test4)// 第i个位置上插入stemplate <class T>void String<T>::Insert(int pos, String s){ if(m_Length+s.m_Length > m_Size) // 空间不够 ReNew(m_Length+s.m_Length);for(int i=m_Length-1; i>=pos; i--) // 向后移位 m_Data[i+s.m_Length] = m_Data[i];for(i=0; i<s.m_Length; i++)m_Data[pos+i] = s.m_Data[i];m_Length += s.m_Length;}// 删除子串template <class T>void String<T>::Delete(int pos,int len){ for(int i=pos+len; i<m_Length; i++) // 向前移位 m_Data[i-len] = m_Data[i];m_Length -= len;}2.6 顺序串的评价优点:访问子串方便,缺点:空间大小不灵活,插入、删除费时。

数据结构第4章串B教学ppt

数据结构第4章串B教学ppt
严蔚敏、吴伟民编著的经典教材,详细介绍了各 种数据结构及其基本操作,包括串的实现和应用。
《算法导论》
Thomas H. Cormen等编著的经典算法教材,深 入讲解了算法设计和分析的方法,包括串的模式 匹配等算法。
MOOC课程
中国大学MOOC、Coursera等在线教育平台上 提供了大量与数据结构和算法相关的课程,可以 系统地学习相关知识和技能。
压缩串处理技术
针对大规模文本数据,研究压缩串处理技术可以减少存储 空间占用,提高处理效率,是未来发展的重要方向之一。
串的并行处理技术
利用并行计算技术加速串的处理过程,提高处理效率,是 未来研究的热点之一。需要解决并行化算法设计、并行计 算框架选择等问题。
拓展学习资源推荐
1 2 3
《数据结构(C语言版)》
Sunday算法
Sunday算法是一种简单且高效的字符串匹配算法,其核心思 想是当发现不匹配的字符时,直接跳过主串中当前字符之前 的所有字符,将模式串与主串的下一个字符进行比较。
03
串的应用举例
文本编辑中的串操作
01
02
03
字符串匹配
在文本编辑中,经常需要 查找或替换特定的字符串, 这可以通过串的匹配操作 实现。
可以使用数组下标和字 符串截取函数`substr()` 实现串的截取,如`char ch = str[2];`或 `std:string sub = str.substr(2, 4);`。
Python语言实现串的基本操作
串的定义与初始化
在Python中,串使用引号(单引号、双 引号或三引号)进行定义和初始化,如`s = 'hello'`或`s = "hello"`。的比较

数据结构C语言版第4章 串

数据结构C语言版第4章 串

串的基本操作
(8)串比较:StrCompare(S,T),如果串S,T存在,则 若S>T,返回值>0;若S=T,返回值为0;若S<T,返回值 <0。 例如:result=strcmp("baker", “bak") result>0 result=strcmp("12", "12"); result=0 result=strcmp("Jos", "Joseph"); result<0 (9)子串定位: StrIndex(s,t) ,如果s,t存在,则返回t在s中 首次出现的位置,否则返回值为0。 例如:char s1[20] =“this is an example ”; char s2[20]=“ is"; StrIndex(s1,s2) = 3
利用基本操作实现查询index(S,T,pos)

基本思想:
从主串S中取第i(=pos)起,长度和串T相等的子
串,和T比较,若相等,则求得函数值为i(=pos), 否则i值增 1。直到找到和串T相等的子串或者串S中不 存在和T相等的子串为止,即求使下列等式 StrCompare(SubString(S,I, StrLength(T)),T)==0 成立的i值。i的初值应为pos,在找不到的情况下,i= n-m+1,n为S串长,m为T串长。
利用基本操作实现替换RePlace(&S,T,V)
ห้องสมุดไป่ตู้
基本思想: 由S和V生成一个新的串 news。首先将它初始 化为一个空串,然后重复下列两步直至“查找不 成功”为止: (1) 自 pos 位置起在串S中查找和T相同的子串; (2) 将S中不被置换的子串(即从 pos 起到和T 相同子串在S中的位置之前的字符序列)和V相 继联接到news 串上。 最后尚需将S中不被置换的字符序列联接到 news串中,并将所得的新串赋给串 S。

最新课件-数据结构教学第4章串 精品

最新课件-数据结构教学第4章串 精品
例如, 设链表中每个结点只存放一个字符, 则在C语言中可 使用如下说明:
struct list struct list * next; /* 指向下一个结点的指针 */ char data; /* 字符 */
} * point; /* point为结构类型的指针, 指向第一结点 */ 根据上述说明, 字符串′string′的链表存储可用图4.1表示。 如果链表中每个结点可存放4个字符, 则结点结构为: struct list struct list * next;
4.2.2 串的链表存储
由于各种串运算与串的存储方式有密切关系 , 若要随机存 取串中第K个字符, 顺序存储显得比较方便; 若要对串进行插入、 删除等操作, 顺序存储就显得比较繁琐, 而链表存储则显示出 明显的优越性。
链表存储是把可利用的存储空间分成一系列大小相同的 结点 ( 若干连续的存储单元 ), 每个结点含有两个域 : data 域和 next域。 data域用来存放字符; next域用来存放指向下一个结点 (首地址)的指针。 结点的大小是指data域中可以存放字符的个 数, next域的大小则取决于寻址的范围。
元中仅放一个字符。 在一个程序中使用的串变量较少, 且各串 变量的长度又都较短时,如果希望该程序处理字符的速度尽 可能快, 那么选择非紧缩格式比较合适。 在这种存储格式中, 串的长度是隐式的, 串所占用存储单元的个数即为串长。
例: 假设一存储单元可以存放4个字符, 同样对于字串(This is a flag), 共需14个存储单元, 其存放的直观表示如表 4.2。 这 种存储格式对存储空间的利用率仅为25%, 但如上所述, 该方法 在字符加工处理方面会节省时间。 3) 某些计算机( 如一般的微型计算机 ), 是以字节为存取单位 的, 一个字符通常又占用一个字节, 这就自然形成了每个存储 单位存放一个字符的分配方式。这种方式一般不需要存放串 长的存储单元, 而需要以程序中各变量值所不包含的字符作为 结束符。 例: 在C语言中, 字符串存放在一个连续的存储单元中, 一 个字符占一个字节。对于字符串′STRING′, 在微机中只需 7 个 存储单元。直观表示如下:

数据结构c语言版 (4)

数据结构c语言版 (4)

8. 在具有n个单元的循环队列中,队满时共有 ____个元素。 9. 一个栈的输入序列是12345,则栈的输出序 列43512是____。 10.二维数组A[10..20][5..10]采用行序为主方式 存储,每个元素占4个存储单元,并且 A[10][5]的存储地址是1000,则A[18][9]的地 址是____。 四、设有一个顺序栈S,元素s1, s2, s3, s4 , s5, s6依次进栈,如果6个元素的出栈顺 序为s2, s3, s4, s6, s5, s1,则顺序栈 的容量至少应为多少?
子串的位置:子串在主串中第一次出现的第一个字 符的位置。 两个串相等:两个串的长度相等,并且各个对应的 字符也都相同。 a= “program” b= “Program” c= “pro” d= “program ”
串的基本操作:

(1) 创建串 StringAssign (s,string_constant)
a0 0 a0 1 ... a0 ,n 1
a1 0
a1 1
...
a1 ,n 1
...
...
a m1 ,0
a m1 ,1
...
a m-1 , n 1
第0行
a0 0 a1 0 ... a m1 ,0
第1行
a0 1 a1 1 ... a m-1 ,1 ... ... a 0 ,n -1
第m-1行
a 1 ,n -1 ... a m1 ,n -1
矩阵的压缩存储
为多个值相同的元素只分配一个存储空间,对0元 素不分配空间。
1.对称矩阵
aij=aji
K=
{
矩阵的压缩存储
2. 三角矩阵 b. 上三角矩阵
K=
{

数据结构(C语言版)第4章 串

数据结构(C语言版)第4章  串

19/57
一般可使用一个不会出现在串中的特殊字符在串值 的尾部来表示串的结束。例如,C语言中以字符 ‵\0′表示串值的终结,这就是为什么在上述定义中, 串空间最大值maxstrlen为256,但最多只能存放255 个字符的原因,因为必须留一个字节来存放‵\0′字 符。若不设终结符,可用一个整数来表示串的长度, 那么该长度减1的位置就是串值的最后一个字符的位 置。此时顺序串的类型定义和顺序表类似: typedef struct{
上述串的操作是最基本的,其中后四个还有变种形式: strncpy,strncat,strncmp,strnchr。串的其余操作 可由这些基本操作组合而成。n为字符个数。 例1、求子串 求子串的过程即为复制字符序列的过程,将串S中 的第pos个字符开始长度为len的字符复制到串T中。 void substr(string T, string s, int pos, int len) { if(pos<0 || pos>strlen(s)-1 || len<0) error(―parameter error‖) strncpy(T,&s[pos],len); }
6/57
定义和概念(总结)
• 串(String):由零个或多个字符组成的有限序列。记为: s=―a1a2…an ‖ (n≥0) • 概念: –s为串名 – ‚a1a2…an ‖ 为串值 –n为串的长度 –ai,字符 –n=0,空串(Null String),记为:Ф –若ai 都是 ‘ ’,则称为空格串(blank string) –子串:串中任意连续个字符组成的子序列被称为该串的子 串 ,包含子串的串又被称为该子串的主串 –子串在主串中的位置: –串的相等:两个串的串值相等(两个串的长度相等,并且 各个对应的字符也都相同 )

数据结构(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]。

精品课件-数据结构实用教程(C语言版)-第四章 串

精品课件-数据结构实用教程(C语言版)-第四章 串

串的销毁 串的复制
StrLength(S) StrCompare (S, T) Concat (&T, S1, S2) StrEmpty (S)
求串的长度 串比较 串的联结
判串空
SubString (&Sub, S, pos, len)求子串
ClearString (&S)
串的清空
Index (S, T, pos)
4.2串的定长顺序存储表示和实现
如果在程序设计语言中,串只是作为输入或输出的常 量出现,则只需存储此串的串值,即字符序列。
在多数非数值处理的程序中,串也以变量的形式出现, 因此,串也有存储映象问题。
1、串的定长顺序表示
将串中的字符顺序地存放在内 存一片连续的存储单元中。
设串S=‘a1 a2 ... an’,则顺序存 贮结构在内存贮器中的存贮示意图如图 所示:
算法描述如下:
Status Concat(SString T, SString S1, SString S2) { //用T返回S1和S2连接而成的新串。若未截断,则返回TRUE,否 则FALSE
串的基本操作中,通常以“串的整体”作为操作对象。如: 在串中查找某个子串、求取一个子串、在串的某个位置之前插入 一个子串以及删除一个子串等。
(2)相似性: 串的逻辑结构和线性表极为相似
*每一字符都有特定的位序 *基本操作过程相似。
4.1 串类型的定义 4.2 串的表示和实现 4.3 串操作应用举例
; commander
, 4, 3) , 1, 9) , 9, 1)
r 长度为 0 的子串——空串,为“合法”串
Index (S, T, pos) (子串的定位函数) 初始条件:串S和T存在,T是非空串,

数据结构(CC++语言版)第4章串

数据结构(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章串

数据结构第4章串

11 H E L
L
O
W O R
L
D
...
4.2.1 定长顺序存储表示
存储结构定义 基本操作实现
串赋值 void StrAssign(SString S, char *t) 串比较 int StrCompare(SString S,SString T)
求子串 int SubString(SString Sub,SString S,int pos,int len)
答:不能。 由于0号单元存放串长度,而C 语言中char类型占1个字节,即8个 二进制位,所以unsigned char类型 的取值范围是[0,255]。
4.2.1 定长顺序存储表示
存储结构定义 基本操作实现
串赋值 void StrAssign(SString S, char *t) 串比较 int StrCompare(SString S,SString T) 求子串 int SubString(SString Sub,SString S,int pos,int len) 串联接 int Concat(SString T,SString S1,SString S2) 访问串 void StrDisplay(SString S)
串联接 int Concat(SString T,SString S1,SString S2) 访问串 void StrDisplay(SString S)
课堂练习:
实现定长串基本操作——串复制
void StrCopy(SString S,SString T)
S
11 H E L L O 11 H E L
串联接 int Concat(SString T,SString S1,SString S2) 访问串 void StrDisplay(SString S)

数据结构(C语言)_4

数据结构(C语言)_4

第四章串本章介绍了串的逻辑结构,存储结构及串上的基本运算,由于在高级语言中已经提供了较全面的串处理功能,因此本章的重点是掌握在串上实现的模式匹配算法,同时这也是本章的难点。

但是从全书来讲,这属于较简单的一章内容。

4.1 串类型的定义一、串定义:串(String)(或字符串):由零个或多个字符组成的有限序列。

一般记为: s='a1a2...an'(n>=0)其中:s是串的名,用单引号括起来的字符序列是串的值。

串的长度:串中字符的数目n。

空串:零个字符的串,它的长度为零。

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

主串:包含子串的串相应地称为主串。

位置:字符在序列中的序号称为该字符在串中的位置。

子串在主串中的位置:以子串的第一个字符在主串中的位置来表示。

例:a='BEI',b='JING',c='BEIJING',d='BEI JING'串长分别为3,4,7,8,且a,b都是c,d的子串。

称两个串是相等的,当且仅当这两个串的值相等。

特别地,空串是任意串的子串,任意串是其自身的子串。

二、串的抽象数据类型的定义: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的串T。

StrCopy(&T,S):串S存在则由串S复制得串TStrEmpty(S):串S存在则若S为空串,返回真,否则返回假StrCompare(S,T):串S和T存在,若S>T,则返回值大于0,若S=T,则返回值=0,若S<T,则返回值<0StrLength(S):串S存在返回S的元素个数称为串的长度.ClearString(&S):串S存在将S清为空串Concat(&T,S1,S2):串S1和S2存在用T返回由S1和S2联接而成的新串SubString(&Sub,S,pos,len):串S存在,1<=pos<=StrLength(S)且0<=len<=StrLength(S)-pos+1Index(S,T,pos):串S和T存在,T是非空,1<=pos<=StrLength(S),若主串S中存在和串T值相同的子串,则返回它在主串S中第pos个字符之后第一次出现的位置,否则函数值为0Replace(&S,T,V):串S,T和V存在,T是非空串,用V替换主串S中出现的所有与T相等的不重叠的子串StrInsert(&S,pos,T):串S和T存在,1<=pos<=StrLength(S)+1,在串S的第pos个字符之前插入串TStrDelete(&S,pos,len):串S存在,1<=pos<=StrLength(S)-len+1从串中删除第pos个字符起长度为len的子串DestroyString(&S):串S存在,则串S被销毁}ADT String三、串的基本操作对于串的基本操作,许多高级语言均提供了相应的运算或标准库函数来实现。

数据结构 第四章 串

数据结构 第四章 串

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

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

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

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

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

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

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)。
1.KMP算法的特点是在模式匹配时指示主串的指针不会变小。()【北京邮电大学2002一、4(1分)】
2.设模式串的长度为m,目标串的长度为n,当n≈m且处理只匹配一次的模式时,朴素的匹配(即子串定位函数)算法所花的时间代价可能会更为节省。()【长沙铁道学院1998一、1 (1分)】
3.串是一种数据对象和操作都特殊的线性表。()【大连海事大学2001 1、L (1分)】
(3)____;
}
else (4) ___;
}
(5) __
} }【上海大学2000一、2(10分)】
15.完善算法:求KMP算法中next数组。
PROC get _next(t:string,VAR next:ARRAY[1..t.len] OF integer);
BEGIN
j:=1; k:=(1)__; next[1]:=0;
{j=1;
while(j<=t.len)
{ if (s[i]= =t[j])
{ k=1;length1=1;con=1;
while(con)
if (1) _ { length1=length1+1;k=k+1; } else (2) __;
if (length1>length) { index=i; length=length1; }
12.实现字符串拷贝的函数strcpy为:
void strcpy(char *s , char *t) /*copy t to s*/
{ while (________)
}【浙江大学1999一、5 (3分)】
13.下列程序判断字符串s是否对称,对称则返回1,否则返回0;如f("abba")返回1,f("abab")返回0;
IF an THEN BEGIN
(5)__ IF (6)_ THEN writeln(‘Ok.’) ELSE writeln(‘No.’)
END
ELSE writeln(‘No.’)
END.【上海海运学院1998七(15分)】
18.试利用下列栈和串的基本操作完成下述填空题。
initstack(s)置s为空栈;
int f((1)________)
{int i=0,j=0;
while (s[j])(2)________;
for(j--; i<j && s[i]==s[j]; i++,j--);
return((3)_______)
}【浙江大学1999一、6 (3分)】
14.下列算法实现求采用顺序结构存储的串s和串t的一个最长公共子串。
第四章串
一、选择题
1.下面关于串的的叙述中,哪一个是不正确的?()【北方交通大学2001一、5(2分)】
A.串是字符的有限序列B.空串是由空格构成的串
C.模式匹配是串的一种重要运算D.串既可以采用顺序存储,也可以采用链式存储
2若串S1=‘ABCDEFG’, S2=‘9898’,S3=‘###’,S4=‘012345’,执行
10.两个字符串相等的充分必要条件是_______。【西安电子科技大学1999软件一、1(2分)】
11.知U=‘xyxyxyxxyxy’;t=‘xxy’;
ASSIGN(S,U);
ASSIGN(V,SUBSTR(S,INDEX(s,t),LEN(t)+1));
ASSIGN(m,‘ww’)
求REPLACE(S,V,m)= ________。【东北大学1997一、1 (5分)】
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 )
【北京邮电大学1999一、1(2分)】
7.模式串t=‘abcaabbcabcaabdab’,该模式串的next数组的值为(),nextval数组的值为()。
A.2n-1 B.n2 C.(n2/2)+(n/2) D.(n2/2)+(n/2)-1 E. (n2/2)-(n/2)-1 F.其他情况
10.串的长度是指()【北京工商大学2001一、6(3分)】
A.串中所含不同字母的个数B.串中所含字符的个数
C.串中所含不同字符的个数D.串中所含非空格字符的个数
二、判断题
程序(a)
PROCEDURE maxcomstr(VAR s,t : orderstring; VAR index,length : integer);
VAR i,j,k,length1:integer; con:boolean;
BEGIN
index :=0; length :=0; i :=1;
WHILE(i<=s.len) DO
ELSE [ (3)___; (4)_ ]
IF j>mt THEN return (5)____; ELSE return (6)__
ENDF;
【南京理工大学1999三、2(6分)】
17.阅读下列程序说明和pascal程序,把应填入其中的()处的字句写在答题纸上。
程序说明:
本程序用于判别输入的字符串是否为如下形式的字符串:
A.0123 B.1123 C.1231 D.1211
5.串‘ababaaababaa’的next数组为()。【中山大学1999一、7】
A.012345678999 B.012121111212 C.011234223456 D.0123012322345
6.字符串‘ababaabab’的nextval为()
WHILE j<t.len DO
IF k=0 OR t.ch[j]=t.ch[k] THEN BEGIN j:=j+1; k:=k+1; next[j]:=k;END
ELSE k:=(2)___;
END;
【中山大学1998四、1(4分)】
16.下面函数index用于求t是否为s的子串,若是返回t第一次出现在s中的序号(从1开始计),否则返回0。
A.0 1 1 1 2 2 1 1 1 2 3 4 5 6 7 1 2 B.0 1 1 1 2 1 2 1 1 2 3 4 5 6 1 1 2
C.0 1 1 1 0 0 1 3 1 0 1 1 0 0 7 0 1 D.0 1 1 1 2 2 3 1 1 2 3 4 5 6 7 1 2
E.0 1 1 0 0 1 1 1 0 1 1 0 0 1 7 0 1 F.0 1 1 0 2 1 3 1 0 1 1 0 2 1 7 0 1
8.设T和P是两个给定的串,在T中寻找等于P的子串的过程称为__(1)__,又称P为__(2)__。
【西安电子科技大学1998二、5(16/6分)】
9.串是一种特殊的线性表,其特殊性表现在__(1)__;串的两种最基本的存储方式是__(2)__、__(3)__;两个串相等的充分必要条件是__(4)__。【中国矿业大学2000一、3(4分)】
例如:s=‘abcdefcdek’,t=‘cde’,则indse(s,t)=3, index(s,’aaa’)=0。已知t,s的串长分别是mt,ms
FUNC index(s,t,ms,mt);
i:=1;j:=1;
WHILE (i<ms) AND (j<mt) DO
IF s[i]=t[j] THEN [ (1)__; (2)__]
CONST midch=’&’; endch=’$’;
VAR an:boolean; ch:char;
PROCEDURE match(VAR answer: boolean);
VAR ch1,ch2:char; f:boolean;
BEGIN
read(ch1);
IF ch1<>endch
THEN IF (1)__
[j:=1;
WHILE (j<=t.len) DO
[ IF (s[i]=t[j]) THEN
[ k:=1; length1:=1; con:=true;
WHILE con DO
IF (1)__THEN [length1:=length1+1;k:=k+1;] ELSE(2) _;
IF (length1>length) THEN [index:=i; length:=length1; ]
5.设正文串长度为n,模式串长度为m,则串匹配的KMP算法的时间复杂度为________。
【重庆大学2000一、4】
6.模式串P=‘abaabcac’的next函数值序列为________。【西安电子科技大学2001软件一、6(2分)】
7.字符串’ababaaab’的nextval函数值为________。【北京邮电大学2001二、4(2分)】
W&M$其中,子字符串M是子字符串W的字符反向排列,在此假定W不含有字符&和字符$,字符&用作W与M的分隔符,字符$用作字符串的输入结束符。
例如,对输入字符串ab&ba$、11&12$、ab&dd$、&$,程序将分别输出Ok.(是),No.(不是)。
程序
PROGRAM accept(input,output);
【北京邮电大学1998二、3(2分)】
8.若串S=’software’,其子串的数目是()。【西安电子科技大学2001应用一、2(2分)】
A.8 B.37 C.36 D.9
9.设S为一个长度为n的字符串,其中的字符各不相同,则S中的互异的非平凡子串(非空且不同于S本身)的个数为()。【中科院计算所1997】
VAR s:stack; i,n:integer; succ:boolean; ch: char;
相关文档
最新文档