数据结构 第四章 章节重点概要

合集下载

第4 章知识点总结

第4 章知识点总结

第4 章知识点总结在第四章中,我们将探讨一些重要的知识点,包括:数据结构、算法、排序算法、搜索算法等内容。

这些知识点对于我们理解计算机科学和编程十分重要,因此我们需要认真学习和掌握。

接下来,我们将深入研究这些知识点,并总结出一些重要的观点和技巧,希望能够对大家的学习有所帮助。

1. 数据结构数据结构是指在计算机中组织和存储数据的方式。

常见的数据结构包括数组、链表、栈、队列、树、图等。

每种数据结构都有其特点和适用场景,我们需要根据具体的问题选择合适的数据结构。

在实际编程中,我们经常需要对数据进行增删改查操作,因此对于数据结构的理解和运用非常重要。

2. 算法算法是解决问题的方法和步骤,是计算机程序的核心。

好的算法可以提高程序的效率和性能。

常见的算法包括排序算法、搜索算法、动态规划、递归等。

了解这些算法的原理和实现方式,能够帮助我们解决各种复杂的问题,提高编程能力。

3. 排序算法排序算法是将一组数据按照一定规则进行排列的算法。

常见的排序算法包括:冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等。

每种排序算法都有其特点和适用场景,我们需要根据具体的问题选择合适的排序算法。

了解这些排序算法的原理和实现方式,能够帮助我们对数据进行高效的排序操作。

4. 搜索算法搜索算法是在一组数据中查找指定元素的算法。

常见的搜索算法包括:线性查找、二分查找、哈希查找、深度优先搜索、广度优先搜索等。

每种搜索算法都有其特点和适用场景,我们需要根据具体的问题选择合适的搜索算法。

了解这些搜索算法的原理和实现方式,能够帮助我们高效地查找指定元素。

5. 总结在第四章中,我们学习了数据结构、算法、排序算法、搜索算法等重要的知识点。

这些知识点对于我们理解计算机科学和编程十分重要,因此我们需要认真学习和掌握。

在实际编程中,我们需要根据具体的问题选择合适的数据结构和算法,提高程序的效率和性能。

希望通过对这些知识点的深入研究和总结,能够对大家的学习有所帮助。

数据结构第四章

数据结构第四章

S pos
A 插入前
S
T
A
pos 插入后
MAXLEN MAXLEN
T 插入串
省级精品课程配套教材 高等学校计算机类“十二五”规划教材
(2) 插入后串长(st+st+st≥MAXLEN且pos+st<MAXLEN,则A后移时 会有部分字符被舍
S
A
pos 插入前
MAXLEN 舍弃
如图所示:
0123
4 567
8 … MAXLEN
a b c d e f g h …z
图4.3 串 的 定 长 顺 序 存 储
省级精品课程配套教材 高等学校计算机类“十二五”规划教材
4.2.2 顺序串的基本操作
1. 串插入函数(StrInsert(S, pos,T))
在进行串的插入时,插入位置pos将串分为两部分(假设为S、A,长度为st+1、 st+1),及待插入部分(假设为T,长度为st+1),则串由插入前的SA变为STA, 可能有三种情况: (1) 插入后串长(st + st + st)<MAXLEN,则将A后移st个元素位置, 再将T插入,
18 for(i=0; i<=st; i++)
19
S->ch[i+pos]=T.ch[i];
20 S->last=MAXLEN;
21 }
22 else
23 { /*串T的部分字符序列要舍弃*/
24 for(i=0; i<MAXLEN-pos; i++)
25
S->ch[i+pos]=T.ch[i];
如何标识实际长度 ?可用以下方法

数据结构各章概要

数据结构各章概要

数据结构各章概要数据结构是计算机科学中非常重要的一个学科,其主要研究各种数据的组织方式和操作方法。

善于运用合适的数据结构可以提高算法的效率,并优化程序的性能。

本文将对数据结构的各个章节进行概要介绍,帮助读者了解不同章节的主要内容和应用。

第一章:引论在引论章节,我们将引入数据结构的基本概念和术语,例如什么是数据、数据项、数据对象等等。

同时,还将介绍数据结构的分类和基本操作,如搜索、遍历、插入、删除和排序。

这些基础知识是后续章节的基础。

第二章:线性表线性表是数据结构中最简单、最基本的一种结构。

其特点是数据元素之间的前驱和后继关系非常明确。

线性表可以用数组和链表两种方式实现。

在本章节中,我们将分别介绍顺序表和链表的实现原理、插入、删除、合并以及应用场景。

第三章:栈和队列栈和队列是两种特殊的线性表结构,它们对数据的访问具有限制性。

栈具有“先进后出”的特点,而队列则具有“先进先出”的特点。

在本章节中,我们将介绍栈和队列的实现方式以及常见的应用场景,如递归、表达式求值、广度优先搜索等。

第四章:串串是由零个或多个字符组成的有限序列,其长度可以为零。

在本章节中,我们将介绍串的定义和操作,包括字符串的模式匹配、模式识别和编辑操作。

串的相关算法在文本处理、计算机网络等领域具有广泛的应用。

第五章:数组和广义表数组是一种在内存中以连续方式存储的数据结构,它具有高效的随机访问特性。

广义表是线性表的一种扩展,可以包含表结构、原子结构以及其他广义表。

本章节将介绍数组和广义表的定义、操作和应用。

第六章:树树是一种非线性的数据结构,具有分层次、递归和层次遍历等特点。

在本章节中,我们将介绍树的基本概念、二叉树、树的遍历算法、平衡树以及树的应用,如编译器中的语法树、文件系统的目录结构等。

第七章:图图是一种复杂的非线性数据结构,由顶点集合和边集合组成。

在本章节中,我们将介绍图的各种表示方式,图的遍历算法、最短路径算法以及常用的图算法,如最小生成树算法和拓扑排序。

数据结构课程各章的重点及要点

数据结构课程各章的重点及要点

《数据结构》考试大纲(2006年)一、考试大纲的性质数据结构是报考我校计算机应用技术硕士的考试科目之一。

为帮助考生明确考试复习范围和有关要求,特制定本考试大纲。

二、考试范围和内容第一章数据结构基本概念1、基本概念:理解什么是数据、数据对象、数据元素、数据结构、数据的逻辑结构与物理结构、数据结构的抽象层次。

2、面向对象概念和算法渐进时间复杂度分析第二章数组1、作为抽象数据类型的数组:数组的定义、数组的按行顺序存储与按列顺序存储要点:➢确定数组元素的三要素:行号、列号、元素值➢数组元素的存放地址计算2、顺序表:顺序表的定义、搜索、插入与删除要点:➢顺序表搜索算法、平均比较次数的计算➢插入与删除算法、平均移动次数的计算3、字符串:字符串的定义及其操作的实现要点:➢串重载操作的定义与实现➢字符串的模式匹配第三章链接表1、单链表:单链表定义、相应操作的实现。

要点:➢单链表的两种定义方式(复合方式与嵌套方式)➢单链表的搜索算法与插入、删除算法2、循环链表:单链表与循环链表的异同3、双向链表:带表头结点的双向循环链表要点:➢双向循环链表的定义,带表头结点的优点➢双向链表的搜索、插入与删除算法第四章栈与队列1、栈:栈的特性、栈的基本运算要点:➢栈的数组实现、栈的链表实现➢栈满及栈空条件2、栈的应用:表达式计算,用后缀表示计算表达式,中缀表示改后缀表示3、队列:队列的特性、队列的基本运算要点:➢队列的数组实现:循环队列中队头与队尾指针的表示,队满及1队空条件➢队列的链表实现:链式队列中的队头与队尾指针的表示、4、双向队列:双向队列的插入与删除算法5、优先级队列:优先级队列的插入与删除算法第五章递归与广义表1、递归:递归的定义、递归的数据结构、递归问题用递归过程求解要点:➢链表是递归的数据结构,可用递归过程求解有关链表的问题2、递归实现时栈的应用要点:➢递归的分层(树形)表示:递归树➢递归深度(递归树的深度)与递归工作栈的关系3、广义表:广义表定义、长度、深度、表头、表尾要点:➢用图形表示广义表的存储结构:➢非递归广义表的递归算法,包括复制、求深度、求长度、删除等算法第六章树与森林1、树:树的定义、树的基本运算要点:➢树的分层定义是递归的➢树中结点个数与高度的关系2、二叉树:二叉树定义、二叉树的基本运算要点:➢二叉树性质、二叉树中结点个数与高度的关系、不同种类的二叉树棵数➢完全二叉树的顺序存储、完全二叉树的双亲、子女和兄弟的位置➢二叉树的前序·中序·后序遍历的递归算法3、霍夫曼树:霍夫曼树的构造方法、霍夫曼编码、带权路径长度的计算要点:➢霍夫曼树是带权路径长度最小的扩充二叉树➢构造霍夫曼树时,按构造算法,每次具最小关键码的子树是根的左子树,具次小关键码的子树是根的右子树➢在构造过程中,新二叉树按根的权值加入到森林的最后4、树与森林要点:➢树的广义表表示、树的双亲表示、树的左子女-右兄弟表示➢树、森林与二叉树的对应关系➢树的先根·后根·层次遍历算法5、堆:堆的定义、堆的插入与删除算法要点:➢形成堆时用到的向下调整算法➢形成堆时的调整过程➢堆插入时用到的向上调整算法以及堆插入删除算法的时间复杂度分析2第七章搜索1、等价类、并查集要点:➢等价关系、等价类➢并查集:并查集定义、并查集的三种基本运算的实现2、基本搜索方法要点:➢对一般表的顺序搜索算法➢对有序顺序表的顺序搜索算法,包括递归和非递归算法➢对有序顺序表的折半搜索算法、包括递归和非递归算法3、二叉搜索树要点:➢动态搜索树与静态搜索树的特性➢二叉搜索树的定义、二叉搜索树上的递归和非递归搜索算法➢二叉搜索树搜索时的平均搜索长度(成功与不成功)的计算➢二叉搜索树的插入与删除算法第八章图1、图:图的定义与图的存储表示要点:➢邻接矩阵表示(通常是稀疏矩阵)➢邻接表与逆邻接表表示,要求建立算法➢邻接多重表(十字链表)表示2、深度优先遍历与广度优先遍历要点:➢生成树与生成树林的定义➢深度优先搜索算法和广度优先搜索算法➢深度优先搜索是个递归的过程,而广度优先搜索是个非递归的过程➢为防止重复访问已经访问过的顶点,需要设置一个访问标志数组visited3、图的连通性要点:➢深度优先搜索可以遍历一个连通分量上的所有顶点➢对非连通图进行遍历,可以建立一个生成森林➢对非强连通图进行遍历,可能建立一个生成森林4、最小生成树要点:➢对于连通网络、可用不会构成环路的权值最小的n-1条边构成最小生成树➢会画出用Kruskal算法及Prim算法构造最小生成树的过程5、最短路径(单源最短路径、任意顶点间的最短路径)要点:➢采用逐步求解的方式求某一顶点到其他顶点的最短路径的方法➢要求每条边的权值为任意值➢三种最短路径的算法实现方法第九章排序31、基本概念:关键码、初始关键码排列、关键码比较次数、数据移动次数、稳定性、附加存储、内部排序、外部排序2、熟悉以下常用排序算法的稳定性、算法的复杂度2、插入排序要点:➢直接插入、折半插入、链表插入、希尔排序算法的原理和实现方法;重点是算法的稳定性、算法的复杂度3、选择排序要点:➢用直接选择排序在一个待排序区间中选出最小的数据时,与区间第一个数据对调,而不是顺次后移。

数据结构自学第四章

数据结构自学第四章

q:是一个列循环线性链表中的搜索指 针,q指示被插入或删除结点在列循环线
性链表中的直接前驱结点;
hl[j]:hl是一个向量,其每个分量是 矩阵A的十字链表中个行列循环线性链表 的表头指针;
下面讲述相加的过程。
1.使pa和pb分别指向矩阵A和B的十字链表 中第一行的第一个非零元素;若矩阵B的该行 中没有非零元素结点或该行的非零元素已处 理完,则令ca和cb同时转到下一行链表的表头 结点,即: ca=ca->next; cb=cb->next; 2.若矩阵B的该行有非零元素结点,则比较 pa和pb所指结点的列号,此时存在三种可能 的情况:
LOC(ai1i2…in)=LOC(a11…1)
+u2u3…un (i1-1)
+u3u4…un(i2-1) +u4u5…un(i3-1)
+…+un(in-1-1)+(in-1)
即 其中
LOC (ai1i 2in ) LOC (a111 ) s j (i j 1)
j 1
n
sj
if(t>0) {q=1; for(col=1;col<=n;col++) for(k=1;k<=t;k++) if(a[k].j==col) {b[q].i=a[k].j; b[q].j=a[k].i; b[q].val=a[k].val; q++; } } }
上述算法的时间复杂度O(n×t),空间复杂
struct node {int i,j; float val; }; typedef struct node NODE;
void trans1(NODE a[],NODE b[]) {int col,k,q,n,t; n=a[0].j; t=(int)a[0].val; b[0].i=a[0].j; b[0].j=a[0].i; b[0].val=a[0].val;

数据结构叶核亚第五版第四章

数据结构叶核亚第五版第四章

数据结构叶核亚第五版第四章
第五版的《数据结构叶核亚》第四章主要讲解了栈和队列这两种线性数据结构,以下是章节内容的简要概述:
1. 栈的定义及其特点:栈是一种只允许在栈顶进行插入、删除操作的线性表,具有后进先出(LIFO)的特点。

栈顶指针始终指向栈顶元素,栈底为固定位置。

2. 栈的顺序存储结构:采用数组实现,需要定义一个栈顶指针和一个栈底指针,可以使用top变量表示栈顶指针,初始值为-1,每次插入或删除元素时更新top的值即可。

3. 栈的链式存储结构:采用链表实现,链表的头节点代表栈底,尾节点代表栈顶,每次插入或删除元素时只需要修改指针即可。

4. 栈的应用:主要包括表达式求值、函数调用等方面。

5. 队列的定义及其特点:队列是一种先进先出(FIFO)的线性表,只允许在一端插入,另一端删除,插入操作称作入队,删除操作称作出队。

6. 队列的顺序存储结构:采用数组实现,需要定义一个头指针和一个尾指针,可以使用front和rear变量来表示,初始值均为0。

7. 队列的链式存储结构:同样采用链表实现,需要定义一个头指针和一个尾指针,插入操作在链表尾部进行,删除操作在链表头部进行。

8. 循环队列:为了避免队列空间的浪费,可以采用循环队列的方式实现,即将队列当作一个环型结构来处理。

9. 双端队列:双端队列是一种两端都可以进行插入和删除操作的队列,支持队列和栈的所有操作。

以上就是《数据结构叶核亚》第四章的主要内容概述。

数据结构第四章:串


例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个字符。*/ 个字符。 串其中 且数组 至少可容纳 个字符

数据结构第四章资料

an1ij n mkin
j1 kj1
n维数组
LO [j1 ,j2 C , ,jn ] LO [0 ,0 , C ,0 ] nc iji L i 1
c n L ,c i 1 b i c i,1 i n
练习 设有一个二维数组A[m][n]按行优先顺序存储,假设A[0][0]存放位置在644(10),A[2][2]存放位置 在676(10),每个元素占一个空间,问A[3][3](10)存放在什么位置?脚注(10)表示用10进制表示。
研究者将人的DNA和病毒DNA均表示成由一些字母组成的字符串序列。 然后检测某种病毒DNA序列是否在患者的DNA序列中出现过,如果出现过,则此人感染了该病毒,否 则没有感染。 例如,假设病毒的DNA序列为baa,患者1的DNA序列为aaabbba,则感染,患者2的DNA序列为babbba, 则未感染。 (注意,人的DNA序列是线性的,而病毒的DNA序列是环状的)
}
BF算法时间复杂度
例: S=‘0000000001’,T=‘0001’,pos=1
若n为主串长度,m为子串长度,最坏情况是 ✓主串前面n-m个位置都部分匹配到子串的最后一位,即这n-m位各比较了m次 ✓最后m位也各比较了1次
总次数为:(n-m)*m+m=(n-m+1)*m 若m<<n,则算法复杂度O(n*m)
R {a ,a 1
j1jijn j1ji 1jn
|
0jk bk 1, 1kn,且ki,
0ji bk 2, aj1jijn,aj1ji1jn D,i 2,,n}
基本操作:
(1) InitArray (&A,n,bound1, boundn)
//构造数组A
(2) DestroyArray (&A)

数据结构第4章


第3 页
《数据结构》第四章
4.1 串的逻辑结构
4.1.1 串的定义
串(String)是字符串的简称。它是一种在数据元素的组成上具有一 定约束条件的线性表,即要求组成线性表的所有数据元素都是字符。所以, 也可以这样定义串:串是由零个或多个字符组成的有限序列。 串一般记 作:s= “a1a2...an” (n≥0),其中,s是串的名称,用双引号("")括起来 的字符序列是串的值;双引号本身不是串的值,它们是串的标记,以便将 串与标识符(如变量名)加以区别,称为定界符;ai(1≤i≤n)可以是字母、 数字或其他字符;串中字符的数目n被称作串的长度(或串长)。当n=0 时,串中没有任何字符,其串的长度为0,称为空串,用φ表示。而空格 串是有一个或者多个空格组成的串,串的长度为所含空格的个数。例如: s1= "" s2= " " s1中没有字符,是一个空串;而s2中有两个空格字符,它的长度等于2, 它是一个空格串。
第10 页
《数据结构》第四章
(6)串定位:StrIndex(s,t,pos) 操作条件:串s和t存在。 操作结果:若主串s中存在和串t值相同的子串, 则返回t在主串s中第pos个字 符之后第一次出现的位臵,pos如果省略,默认为1,否则返回值为-1。 例如:StrIndex("abebebda","be")=2,StrIndex("abcdebda","ba")=-1 (7)串插入操作:StrInsert(&s,pos,t) 操作条件:串s和t存在,且1≤pos≤StrLength(s)+1。 操作结果:将串t插入到串s的第pos个字符位臵之前,s的串值发生改变。 例如:s="chater",t="rac",pos=4,则StrInsert (s,pos,t)的运算结果为 s="character"。 (8)串删除操作:StrDelete(&s,pos,len) 操作条件:串s存在,且1≤pos≤StrLength(s),0≤len≤StrLength(s)-pos+1。 操作结果:删除串s中从第pos个字符开始的长度为len的子串,s的串值改变。 例如:s="Microsoft",pos=4,len=5,则StrDelete (s,pos,len)的运算结果 为s="Mict"。

自考《数据结构》各章要点

自考《数据结构》各章要点第一章概论数据就是指能够被计算机识别、存储和加工处理的信息的载体。

数据元素是数据的基本单位,可以由若干个数据项组成。

数据项是具有独立含义的最小标识单位。

数据结构的定义:·逻辑结构:从逻辑结构上描述数据,独立于计算机。

·线性结构:一对一关系。

·线性结构:多对多关系。

·存储结构:是逻辑结构用计算机语言的实现。

·顺序存储结构:如数组。

·链式存储结构:如链表。

·索引存储结构:·稠密索引:每个结点都有索引项。

·稀疏索引:每组结点都有索引项。

·散列存储结构:如散列表。

·数据运算。

·对数据的操作。

定义在逻辑结构上,每种逻辑结构都有一个运算集合。

·常用的有:检索、插入、删除、更新、排序。

数据类型:是一个值的集合以及在这些值上定义的一组操作的总称。

·原子类型:由语言提供。

·结构类型:由用户借助于描述机制定义,是导出类型。

抽象数据类型ADT:·是抽象数据的组织和与之的操作。

相当于在概念层上描述问题。

·优点是将数据和操作封装在一起实现了信息隐藏。

程序设计的实质是对实际问题选择一种好的数据结构,设计一个好的算法。

算法取决于数据结构。

算法是一个良定义的计算过程,以一个或多个值输入,并以一个或多个值输出。

评价算法的好坏的因素:·算法是正确的;·执行算法的时间;·执行算法的存储空间(主要是辅助存储空间);·算法易于理解、编码、调试。

时间复杂度:是某个算法的时间耗费,它是该算法所求解问题规模n的函数。

渐近时间复杂度:是指当问题规模趋向无穷大时,该算法时间复杂度的数量级。

评价一个算法的时间性能时,主要标准就是算法的渐近时间复杂度。

算法中语句的频度不仅与问题规模有关,还与输入实例中各元素的取值相关。

时间复杂度按数量级递增排列依次为:常数阶O(1)、对数阶O(log2n)、线性阶O(n)、线性对数阶O(nlog2n)、平方阶O(n^2)、立方阶O(n^3)、……k次方阶O(n^k)、指数阶O(2^n)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第四章串串是字符串的简称,可以将它看作一种特殊的线性表,其数据元素仅由一个字符组成。

计算机非数值处理的对象经常是字符串,如在汇编和高级语言的编译程序中,源程序和目标程序都是字符串数据;在事件处理程序中,顾客的姓名、地址、货物的产地、名称等,一般也是作为字符串处理的。

另外串还具有自身的特性,常常把一个串作为一个整体来处理,因此,一般线性表和串的操作有较大区别,本章主要讨论串的基本概念和存储结构,通过本章的学习,读者应掌握串的一些基本运算。

4.1 串及基本运算4.1.1 串的基本概念1.串的定义串是由零个或多个任意字符组成的字符序列。

一般记作:s="s1 s2 … s n""其中s 是串名;用双引号作为串的定界符,引号引起来的字符序列为串值,引号本身不属于串的内容;a i(1≤i≤n)是一个任意字符,它称为串的元素,是构成串的基本单位,i是它在整个串中的序号; n为串的长度,表示串中所包含的字符个数,如:s="I’m a student!",串的长度为14,当n=0时,称为空串,如:s="",通常记为Ф。

2.几个术语子串与主串:串中任意连续的字符组成的子序列称为该串的子串。

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

子串的位置:子串的第一个字符在主串中的序号称为子串的位置。

串相等:如果两个串的长度相等且对应字符都相等,则称两个串是相等的。

例如:A=”China Beijing”,B=”Beijing”,C=”China”,则它们的长度分别为13、7和5,B和C是A的子串,B在A中的位置是7,C在A中的位置是1。

由一个或多个空格字符组成的串,称为空格串,其长度为串中空格字符的个数。

请注意空串和空格串的区别。

4.1.2 串的基本运算串的运算有很多,下面介绍部分基本运算:1.求串长StrLength(s)操作条件:串s存在操作结果:求出串s的长度。

2.串赋值StrAssign(s1,s2)操作条件:s1是一个串变量,s2或者是一个串常量,或者是一个串变量(通常s2 是一个串常量时称为串赋值,是一个串变量称为串拷贝)。

操作结果:将s2的串值赋值给s1,s1原来的值被覆盖掉。

3.连接操作:StrConcat (s1,s2)操作条件:串s1,s2存在。

操作结果:将s2连接在s1的后面,形成一个新串,s2不变。

4.求子串SubStr (s,i,len)操作条件:串s存在,1≤i≤StrLength(s),0≤len≤StrLength(s)-i+1。

操作结果:返回从串s的第i个字符开始的长度为len 的子串。

len=0得到的是空串。

5.串比较StrCmp(s1,s2)操作条件:串s1,s2存在。

操作结果:若s1==s2,操作返回值为0;若s1<s2, 返回值<0;若s1>s2, 返回值>0。

6.子串定位StrIndex(s,t):找子串t在主串s中首次出现的位置操作条件:串s,t存在。

操作结果:若t∈s,则操作返回t在s中首次出现的位置,否则返回值为-1。

7.串插入StrInsert(s,i,t)操作条件:串s,t存在,1≤i≤StrLength(s)+1。

操作结果:将串t插入到串s 的第i个字符位置上,s的串值发生改变。

8.串删除StrDelete(s,i,len)操作条件:串s存在,1≤i≤StrLength(s),0≤len≤StrLength(s)-i+1。

操作结果:删除串s 中从第i个字符开始的长度为len的子串,s的串值改变。

9.串替换StrRep(s,t,r)操作条件:串s,t,r存在,t不为空。

操作结果:用串r 替换串s中出现的所有与串t相等的不重叠的子串,s的串值改变。

以上串的基本操作中,前5个操作是最为基本的,它们不能用其他的操作来合成,因此通常将这5个基本操作称为最小操作集。

4.2 串的定长顺序存储及基本运算由于串是数据元素为字符的线性表,因此线性表的存储方式仍适用于串,也因为字符的特殊性和字符串经常作为一个整体来处理的特点,串在存储和运算又和一般的线性表不完全相同。

4.2.1 串的定长顺序存储类似于顺序表,用一组地址连续的存储单元存储串中的字符序列,所谓定长是指按预定义的长度,为每一个串变量分配一个固定长度的存储区,如:#define MAXSIZE 256char s[MAXSIZE];则串的最大长度不能超过256。

对于串的实际长度有两种表示方法:1. 类似顺序表,用一个指针来指向最后一个字符,这样表示的串描述如下:typedef struct{ char data[MAXSIZE];int curlen; //变量curlen存储的是串中最后一个有效字符在data中的下标} SeqString;定义一个串变量:SeqString s;这种存储方式可以直接得到串的长度:s.curlen+1。

如图4.1所示。

s.dataMAXSIZE-1s.curlen图4.1 串的第一种顺序存储方式2. 在串尾存储一个不会在串中出现的特殊字符作为串的终结符,以此表示串的结尾。

比如C语言中处理定长串的方法就是这样的,它是用’\0’来表示串的结束。

这种存储方法不能直接得到串的长度,是用判断当前字符是否是’\0’来确定串是否结束,从而求得串的长度。

此时的串长为隐含值,显然不便于进行某些串操作。

char s[MAXSIZE];MAXSIZE-1图4.2 串的顺序存储方式23. 设定长串存储空间:char s[MAXSIZE+1]; 用s[0]存放串的实际长度,串值存放在s[1]~s[MAXSIZE],字符的序号和存储位置一致,应用更为方便。

4.2.2 定长顺序串的基本运算这里主要讨论定长串连接、求子串、串比较算法,顺序串的插入和删除等运算基本与顺序表相同,在此不在赘述。

串定位在下一小节讨论,设串结束用'\0'来标识。

1.串连接:把两个串s1和s2首尾连接成一个新串s ,即:s<=s1+s2。

int StrConcat1(char s1[ ],char s2[ ],s[ ]){ int i=0 , j, len1, len2;len1= StrLength(s1); len2= StrLength(s2);if (len1+ len2>MAXSIZE-1) return 0 ; /* s长度不够*/j=0;while(s1[j]!=’\0’) { s[i]=s1[j];i++; j++; }//将串s1复制到s中j=0;while(s2[j]!=’\0’) { s[i]=s2[j];i++; j++; }//将串s2复制到s中s[i]=’\0’;return 1;}算法4.12.求子串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;}算法4.23.串比较int StrComp(char *s1, char *s2){ int i=0;while (s1[i]==s2[i] && s1[i]!=’\0’) i++;return (s1[i]-s2[i]);}算法4.34.2.3 模式匹配子串的定位操作通常称之为模式匹配,是各种串处理系统中最重要的操作之一。

设s 和t 是给定的两个串,在主串s 中找到等于子串t 的过程称为模式匹配,如果在s 中找到等于t 的子串,则称匹配成功,函数返回t 在s 中的首次出现的存储位置,否则匹配失败,返回-1。

t 称为模式串。

为了运算方便,设字符串的长度存放在0号单元,串值从1号单元存放,这样字符序号与存储位置一致。

1.简单的模式匹配算法算法思想如下:首先将s 1与t 1进行比较,若不同,就将s 2与t 1进行比较,...,直到s 的某一个字符s i 和t 1相同,再将它们之后的字符进行比较,若也相同,则如此继续往下比较,当s 的某一个字符s i 与t 的字符t j 不同时,则s 返回到本趟开始字符的下一个字符,即s i-j+2,t 返回到t 1,继续开始下一趟的比较,重复上述过程。

若t 中的字符全部比完,则说明本趟匹配成功,本趟的起始位置是i-j+1或i-t[0],否则,匹配失败。

设主串s="ababcabcacbab ",模式t="abcac ",匹配过程如图4.3所示。

依据些匹配过程,匹配算法描述如下: int Index(char *s,char *t)第一趟第二趟第三趟第四趟第五趟第六趟图4.3 简单模式匹配的匹配过程/*从串s的第一个字符开始找首次与串t相等的子串*/{ int i=1,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 –1;}算法4.4本算法最好情况下的时间复杂度是O(n+m),最坏情况下的时间复杂度是O(n*m),其中m、n分别为s和t的长度。

*2.改进后的模式匹配算法BF算法简单但效率较低,一种对BF算法做了很大改进的模式匹配算法是克努特(Knuth),莫里斯(Morris)和普拉特(Pratt)同时设计的,简称KMP算法。

(1)KMP算法的思想分析算法4.4的执行过程, 造成BF算法速度慢的原因是回溯,即在某趟的匹配过程失败后,对于s串要回到本趟开始字符的下一个字符,t串要回到第一个字符。

而这些回溯并不是必要的。

如图4.3所示的匹配过程,在第三趟匹配过程中,s3 ~ s6和t1~ t4是匹配成功的,s7≠t5匹配失败,因此有了第四趟,其实这一趟是不必要的:由图可看出,因为在第三趟中有s4=t2,而t1≠t2,肯定有t1≠s4。

同理第五趟也是没有必要的,所以从第三趟之后可以直接到第六趟,进一步分析第六趟中的第一对字符s 6和t1的比较也是多余的,因为第三趟中已经比过了s6和t4,并且s6=t4,而t1=t4,必有s6=t1,因此第六趟的比较可以从第二对字符s7和t2开始进行,这就是说,第三趟匹配失败后,指针i不动,而是将模式串t 向右“滑动”,用t2“对准”s 7继续进行,依此类推。

相关文档
最新文档