第4章 串、数组和广义表

合集下载

【C语言版】4第四章串,数组,广义表

【C语言版】4第四章串,数组,广义表

且 T 是非空串。
操作结果:用V替换主串S中出现 的所有与(模式串)T 相等的不重叠的子串。
例如:
假设 S = abcaabcaaabca,T = bca
基 本 操 作
若 V = x, 则经置换后得到 S = axaxaax
若 V = bc, 则经置换后得到 S = abcabcaabc
DestroyString (&S)
基 本 操 作
初始条件:串 S 存在。 操作结果:串 S 被销毁。
StrEmpty(S)
基 本 操 作
初始条件:串S存在。
操作结果:若 S 为空串,则返回TRUE, 否则返回 FALSE。
表示空串,空串的长度为零。
StrCompare(S,T)
基 本 操 作
StrDelete (&S, pos, len)
基 本 操 作
初始条件:串S存在
1≤pos≤StrLength(S)-len+1。
操作结果:从串S中删除第pos个字符 起长度为len的子串。
ClearString
基 本 操 作
(&S)
初始条件:串S存在。 操作结果:将S清为空串。
对于串的基本操作集可以有不同的定义 方法,在使用高级程序设计语言中的串类型 时,应以该语言的参考手册为准。
串的逻辑结构和线性表极为相似,区别 仅在于串的数据对象约束为字符集。
基 本 操 作
串的基本操作和线性表有很大差别。
在线性表的基本操作中,大多以“单个元 素”作为操作对象; 在串的基本操作中,通常以“串的整体” 作为操作对象。
4.1.2 串的表示和实现
串 在程序设计语言中,串只是作为 的 表 示 输入或输出的常量出现,则只需存储 和 实 此串的串值,即字符序列即可。但在 现

数据结构第4章 数组和广义表

数据结构第4章  数组和广义表

第4章数组和广义表【例4-1】二维数组A的每一个元素是由6个字符组成的串,其行下标i=0,1,…,8,列下标j=1,2,…,10。

若A以行为主序存储元素,A[8][5]的物理地址与当A按列为主序存储时的元素()的物理地址相同。

设每个字符占一个字节。

A.A[8][5] B.A[3][10] C.A[5][8] D.A[0][9]解:二维数A是一个9行10列的矩阵,即A[9][10]。

按行存储时,A[8][5]是第85个元素存储的元素。

而按列存储时,第85个存储的元素是A[3][10]。

即正确答案为B。

【例4-2】若对n阶对称矩阵A以行序为主序方式将其下三角形的元素(包括主对角线上所有元素)依次存放于一维数组B[n(n+1)/2]中,则在B中确定的位置k的关系为()。

A.jii+-2)1(*B.ijj+-2)1(*C.jii++2)1(*D.ijj++2)1(*解:如果a ij按行存储,那么它的前面有i-1行,其有元素个数为:1+2+3+…+(i-1)=i(i-1)/2。

同时它又是所在行的第j列,因此它排列的顺序还得加上j,一维数组B[n(n+1)/2]中的位置k与其下标的关系是:jii+-2)1(*。

因此答案为A。

【例4-3】已知n阶下三角矩阵A,按照压缩存储的思想,可以将其主对角线以下所有元素(包括主对角线上元素)依次存放于一维数组B中。

请写出从第一列开始以列序为主序分配方式时在B中确定元素a ij的存放位置的公式。

解:如果a ij按列存储,那么它的前面有j-1列,共有元素:n+(n-1)+(n-2)+ …+[n-(j-2)]=(j-1)*n-2)1)(2(--jj而它又是所在列的第i行,因此在它前的元素个数还得加上i。

因此它在一维数组B中的存储顺序为:(j-1)*n-2)1)(2(--jj+i【例4-4】已知广义表L=((x,y,z),a,(u,t,w)),从L表中取出的原子项ASCII码最大的运算是()。

第四、五章串、数组和广义表练习题答案

第四、五章串、数组和广义表练习题答案

第四、五章串、数组和广义表练习题答案一.填空题1. 不包括任何字符(长度为0)的串称为空串;由一个或多个空格(仅由空格符)组成的串称为空白串。

2. 设S=“A;/document/”,那么strlen(s)= 20 , “/”的字符定位的位置为3。

3. 子串的定位运算称为串的模式匹配;被匹配的主串称为目标串,子串称为模式。

4. 设目标T=”abccdcdccbaa”,模式P=“cdcc”,那么第 6 次匹配成功。

5. 假设n为主串长,m为子串长,那么串的古典(朴素)匹配算法最坏的情形下需要比较字符的总次数为(n-m+1)*m。

6. 假设有二维数组A6×8,每一个元素用相邻的6个字节存储,存储器按字节编址。

已知A的起始存储位置(基地址)为1000,那么数组A的体积(存储量)为 288 B ;末尾元素A57的第一个字节地址为 1282 ;假设按行存储时,元素A14的第一个字节地址为(8+4)×6+1000=1072 ;假设按列存储时,元素A47的第一个字节地址为 (6×7+4)×6+1000)=1276 。

(注:数组是从0行0列仍是从1行1列计算起呢?由末单元为A57可知,是从0行0列开始!)7. 〖00年运算机系考研题〗设数组a[1…60, 1…70]的基地址为2048,每一个元素占2个存储单元,假设以列序为主序顺序存储,那么元素a[32,58]的存储地址为8950 。

答:不考虑0行0列,利用列优先公式:LOC(a ij)=LOC(a c1,c2)+[(j-c2)*(d1-c1+1)+i-c1)]*L得:LOC(a32,58)=2048+[(58-1)*(60-1+1)+32-1]]*2=89508. 三元素组表中的每一个结点对应于稀疏矩阵的一个非零元素,它包括有三个数据项,别离表示该元素的行下标、列下标和元素值。

9.求以下广义表操作的结果:(1)GetHead【((a,b),(c,d))】=== (a, b) ; u=;(*b).nu=;(*b).tu=;if{ q=1;for(col=1; __ col<=, ________;col++)for(p=1;p<=;p++)if[p].j ==col){(*b).data[q].i=[p].j;(*b).data[q].j=[p].i;(*b).data[q].v=[p].v;__q++_________;}}23.基于三元组的稀疏矩阵转置的处置方式有两种,以下计算依照矩阵A的三元组的顺序进行转置,请在___________处用适当的句子用以填充。

第4章 串2—第5章 数组和广义表

第4章 串2—第5章 数组和广义表
4
串的基本操作示例:
5
C 语言字符串函数库中提供下列串处理函数: 语言字符串函数库中提供下列串处理函数: 头文件: 头文件:# include <string.h> gets(str) puts(str) strcat(str1, str2) strcpy(str1, str2, k) strcmp(str1, str2) strlen(str) // 输入一个串; 输入一个串; // 输出一个串; 输出一个串; // 串联接函数; 串联接函数; // 串复制函数; 串复制函数; // 串比较函数; 串比较函数; // 求串长函数; 求串长函数;
记为: =‘a 记为:s = a1a2…an’ a 串名 串值
(用‘ ’ 括 起来) 起来)
(n≥0 )
C++中隐含结 C++中隐含结 束符‘ 束符‘\0’ , ASCII码 即ASCII码 NUL
2
串与线性表
串的逻辑结构和线性表极为相似,区别仅在于串 逻辑结构和线性表极为相似,区别仅在于串 极为相似 仅在于 数据对象约束为字符集。 约束为字符集 的数据对象约束为字符集。 串的基本操作和线性表有很大差别。 串的基本操作和线性表有很大差别。 基本操作和线性表有很大差别 线性表的基本操作中 大多以“单个元素” 的基本操作中, 在线性表的基本操作中,大多以“单个元素” 作为操作对象; 作为操作对象; 操作对象 的基本操作中,通常以“串的整体” 在串的基本操作中,通常以“串的整体”作为 操作对象。 操作对象。
20
二维数组的定义: 二维数组的定义: 数据对象: 数据对象 D = {aij | 0≤i≤b1-1, 0 ≤j≤b2-1} 数据关系: 数据关系 R = { ROW, COL } ROW={<ai,j,ai,j+1>|0≤i≤b1-1, 0≤j≤b2-2} COL={<ai,j,ai+1,j>|0≤i≤b1-2, 0≤j≤b2-1}

数据结构(Java版) 模块4 数组、串和广义表

数据结构(Java版)  模块4 数组、串和广义表

特殊矩阵的压缩存储
稀疏矩阵的链式存储表示---十字链表
稀疏矩阵A
稀疏矩阵A的十字链表结构
4.3 串
串的相关概念
串(String)是零个或多个字符组成的有限序列。 一般记为:S=”a1a2…an” (n≥0) n是串中字符的个数,称为串的长度,n=0时的串称为空串。 串中任意个连续的字符组成的子序列称为该串的子串。相对地 包含子串的串称为主串。通常将字符在串中的序号称为该字符在 串中的位置。 当且仅当两个串的值相等时,称这两个串是相等的。即只有当 两个串的长度相等,并且每个对应位置的字符都相等时才相等。 由一个或多个空格字符组成的串,称为空格串,其长度为串中 空格字符的个数。空白串即空串。
【实例1】计算机处理的对象分为数值数据和非数值数据,字符串 是最基本的非数值数据。字符串处理在语言编译、信息检索、文 字编辑等问题中,有广泛的应用。 【实例2】可以利用二维数组来完成五子棋、连连看、俄罗斯方块、 扫雷等常见小游戏。 【实例3】文学研究人员需要统计某篇英文小说中某些形容词的出 现次数和位置。可以用“串”这种数据结构来实现对文字的统计, 相应的程序称为“文学研究助手”。
带状矩阵A
对于三对角带状矩阵的压缩存储,假设以行序为主序进行存储,并且只存 储非零元素:
Loc(aij)=Loc(a11)+3(i-1)-1+j-i+1= Loc(a11)+2(i-1)+j-1
特殊矩阵的压缩存储
稀疏矩阵
一般地,当非零元素个数只占矩阵元素总数的25%—30%,或低于这 个百分数时,称这样的矩阵为稀疏矩阵。 。
模块4 数组、串和广义表
学习目的与要求
重点:
• • • 掌握数组、广义表和稀疏矩阵的基本概念,物理结构和基本操作的实现 充分了解串的基本概念 掌握串的存储结构和相关的操作算法

第4章数组与串第4节广义表

第4章数组与串第4节广义表

// 为原子时输出元素值
if (p->tag==1) cout << ")";
// 为表结点时输出')&)
{ cout << ",";
GLDisp (p->link);
// 递归输出后续表的内容
}
}
}
第4章 数组与串 第4节 广义表
3. 求广义表的长度 所谓广义表的长度是指在广义表中元素个
//p指向广义表的第一个元素
while (p!=NULL)
{ n++;
p=p->link;
}
return n;
}
第4章 数组与串 第4节 广义表
4.广义表的复制 复制一个广义表的算法思想:对于一个广义
表的头结点*p,若为空,则返回空指针;若为子 表,则递归复制子表;否则复制原子结点,然后 递归复制后续表。算法结束返回广义表链表指针。
用字符串变量 s 来表示一个广义表的括号表 达式,从头到尾扫描 s 的每一个符号:
(1)当遇到是左括号,说明是一个表的开始, 则建立一个由 h 指向的表的结点,并用它的dlink 域作为子表的表头指针,进行递归调用;
第4章 数组与串 第4节 广义表
(2)当扫描到一个字母,说明它是一个原子, 则建立一个由h指向的原子结点;
数,由于广义表在同一层次的每个结点是通过 link域链接起来的,所以可把它看做是由link域链 接起来的单链表。这样,求广义表的长度就变成 求单链表的长度了。
第4章 数组与串 第4节 广义表
int GLLength(GLNode *p)
//p为广义表附加头结点的指针
{
int n=0;

《数据结构(C语言)》第4章 串、数组和广义表

《数据结构(C语言)》第4章 串、数组和广义表
Data structures
串的存储与操作
❖ 串的顺序存储与操作 ❖ 1.串的基本操作
(3) 求串长StrLength(s) 返回串s中字符的个数。 算法4.3 求串长度 int StrLength(char s[]) { int len=0;
while(s[len++]!='\0'); return --len; }
4.2(b)所示。当节点大小大于1时,由于串长不一定
是节点大小的整倍数,因此链表中的最后一个节点不
一定全被串值占满,此时通常要补上“#”或其他的
非串值字符(通常,“#”不属于串的字符集,是一个
特殊的符号)。 头指针
S
D
A
E
头指针
S
DATA
STR
UCTU
RE# #
空格符
Data structures
串的存储与操作
charch[CHUNKSIZE];
structChunk *next;
}Chunk;
typedef struct { /*串的链表结构*/
Chunk *head, *tail;/*串的头和尾指针*/
int curlen; /*串的当前长度*/
}LString;
Data structures
串的存储与操作
串(或字符串),是由零个或多个字符组成的有限序列。一般 记为:
s=‘a0a1...an-1’ (n>=0)
其中s是串的名,用单引号括起来的字符序列是串的值;串中字 符的数目n称为串的长度。
❖ 2.空串和空格串
零个字符的串称为空串,它的长度为零。
由一个或多个空格组成的串,称为空格串。它的长度是串中空格字符 的个数。

第4章-串、数组和广义表

第4章-串、数组和广义表

(13) DestroyString(&S)
//串销毁
}ADT String 北京林业大学信息学院
2021年1月9日
6
串的存储结构
顺序存储 链式存储
2021年1月9日
7
顺序存储表示
typedef struct{ char *ch;
int length; }HString;
//若串非空,则按串长分配存储区, //否则ch为NULL //串长度
S :ababcabcacbab

T :abc j
i指针回溯
S :ababcabcacbab
T : abc
S :ababcabcacbab
T : abc
2021年1月9日
13
BF算法设计思想
Index(S,T,pos)
• 将主串的第pos个字符和模式的第一个字符比较, 若相等,继续逐个比较后续字符; 若不等,从主串的下一字符起,重新与模式的第 一个字符比较。
//串的当前长度
}LString;
2021年1月9日
11
串的模式匹配算法
算法目的:
确定主串中所含子串第一次出现的位置(定位) 即如何实现教材P72 Index(S,T,pos)函数
算法种类:
•BF算法(又称古典的、经典的、朴素的、穷举的) •KMP算法(特点:速度快)
2021年1月9日
12
i
BF算法设计思想
(6) StrCopy(&T,S)
//串拷贝
(7) StrEmpty(S)
//串判空
(8) ClearString (&S)
//清空串
(9) Index(S,T,pos)
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Байду номын сангаас
//求子串 //串拷贝 //串判空
(8) ClearString (&S)
(9) Index(S,T,pos)
//清空串
//子串的位置
(11) Replace(&S,T,V)
(12) StrInsert(&S,pos,T)
//串替换
//子串插入
(12) StrDelete(&S,pos,len)
(13) DestroyString(&S)
数据结构
李冬梅
北京林业大学信息学院
2013年7月1日
• 第2章 • 第3章 • 第4章 义表
线性表 栈和队列 串、数组和广
线性结构
a n)
可表示为:(a1 ,
a2
, ……,
北京林业大学信息学院
2013年7月1日
补充:C语言中常用的串运算
调用标准库函数 #include<string.h>
串比较,strcmp(char 串复制,strcpy(char 串连接,strcat(char 求串长,strlen(char ……
a11 a12 a1n a a22 a2 n 21 am1 am 2 amn
2013年7月1日
j (a1 j , a2 j ,, amj ) 1 j n
Amn
北京林业大学信息学院
数组的顺序存储
•以行序为主序
k
S=‘a b a b c a b c a c b a b’ T=‘a b c a c’
k
k
北京林业大学信息学院
2013年7月1日
串操作应用举例--文本编辑
• 文本可被看作一个字符串,称为文本串 • 页则是文本串的子串 • 行又是页的子串。 页表 行表
页号
起始行号
…………
行号 起始地址 长度
…………
C, PASCAL
北京林业大学信息学院
2013年7月1日
•以列序为主序
FORTRAN
北京林业大学信息学院
2013年7月1日
二维数组的行序优先表示
a[n][m]
a[0][1] a[0][0] a[1][1] a[1][0] a a[2][0] a[2][1] a[n 1][0] a[n 1][1] a[0][m 1] a[1][m 1] a[2][m 1] a[n 1][m 1]
D {a j j2jn | a j1 j2jn ElemSet
数据关系: R1 { a j j j , a j j 1 j |
1 i n 1 i n
0 jk bk 1, 1 k n, 且k i, 0 ji bk 2, a j1 ji jn , a j1 ji 1 jn D, i 2,, n}
北京林业大学信息学院
2013年7月1日
KMP(Knuth Morris Pratt)算法
《计算机程序设计艺术 第1卷 基本算法》 98元 《计算机程序设计艺术 第2卷 半数值算法》 98元 《计算机程序设计艺术 第3卷 排序与查找》 98元
/~knuth/
北京林业大学信息学院
2013年7月1日
KMP算法设计思想(了解)
利用已经部分匹配的结果而加快模式串的滑动速度? 且主串S的指针i不必回溯!可提速到O(n+m)!
i i
S=‘a b a b c a b c a c b a b’ aba a T=‘a b c a c’
i i i
S=‘a b a b c a b c a c b a b’ T=‘a b c a c’
}ADT Array
北京林业大学信息学院
2013年7月1日
一维数组
LOC(i) =
0 1 2
a,
3 4
i=0
5 6 7 8 9
LOC(i-1)+l = a+i*l, i > 0
a 35 27 49 18 60 54 77 83 41 02
l l l l l l l a+i*l l l l
LOC(i) = LOC(i-1)+l = a+i*l
北京林业大学信息学院
2013年7月1日
基本操作:
(1) InitArray (&A,n,bound1, boundn) //构造数组A (2) DestroyArray (&A) // 销毁数组A (3) Value(A,&e,index1,…,indexn) //取数组元素值 (4) Assign (A,&e,index1,…,indexn) //给数组元素赋值
北京林业大学信息学院
2013年7月1日
4.2 数组
本节所讨论的数组与高级语言中的数组区别: • 高级语言中的数组是顺序结构; • 而本章的数组既可以是顺序的,也可以是链式结构, 用户可根据需要选择。
北京林业大学信息学院
2013年7月1日
数组的抽象数据类型
ADT Array { 数据对象:
ji 0,bi 1, i 1,2,, n
串相等
空格串
北京林业大学信息学院
2013年7月1日
串的抽象数据类型
ADT String {
数据对象:
基本操作:
D {ai | ai CharacterS , i 1,2,, n, n 0} et
数据关系: R1 { ai 1, ai | ai 1, ai D, i 1,2,, n}
typedef struct{ Chunk *head,*tail; //串的头指针和尾指针 int curlen; //串的当前长度 }LString;
北京林业大学信息学院
2013年7月1日
链式存储表示
优点:操作方便 缺点:存储密度较低
串值所占的存储位 存储密度 实际分配的存储位
可将多个字符存放在一个结点中,以克服其缺点
n维数组
各维元素个数为
m1, m2, m3, …, mn
下标为 i1, i2, i3, …, in 的数组元素的存储位置:
LOC(i1 , i2 ,, in ) a i1 m2 m3 mn i2 m3 m4 mn in 1 mn in
s1,char s2) to,char from) to,char from) s)
北京林业大学信息学院
2013年7月1日
第4章
串、数组和广义表
教学内容
4.1 4.2 4.3 串 数组 广义表
北京林业大学信息学院
2013年7月1日
教学目标
1. 了解串的存储方法,理解串的两种模式匹配 1. 掌握串的存储方法,理解串的两种模式匹 算法,重点掌握BF算法。 配算法; 2. 明确数组和广义表这两种数据结构的特点, 2. 明确数组和广义表这两种数据结构的特点 掌握数组地址计算方法,了解几种特殊矩阵 ,掌握数组存储时地址计算方法,了解几种 的压缩存储方法。 特殊矩阵的压缩存储方法。 3.掌握广义表的定义、性质及其GetHead和 GetTail的操作。
北京林业大学信息学院
2013年7月1日

BF算法设计思想 i S :ababcabcacbab
T :abc j
i指针回溯
S :ababcabcacbab
T : abc
S :ababcabcacbab T : abc
2013年7月1日
北京林业大学信息学院
BF算法设计思想
Index(S,T,pos)
}HString;
北京林业大学信息学院
2013年7月1日
链式存储表示
head
A B C D
head
E F G H
I # # #
A
B
C
...
I
北京林业大学信息学院
2013年7月1日
链式存储表示
#define CHUNKSIZE 80 typedef struct Chunk{ char ch[CHUNKSIZE]; struct Chunk *next; }Chunk; //可由用户定义的块大小
m 1, m2, m3
下标为 i1, i2, i3的数组元素的存储位置:
LOC ( i1, i2, i3 ) = a + i1* m2 * m3 + i2* m3 + i3 前i1页总 第i1页的 第 i2 行前 i3 元素个数 前i2行总 列元素个数
元素个数
北京林业大学信息学院
2013年7月1日
北京林业大学信息学院
2013年7月1日
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)
head
A
head
B
C
D
E
F
G
H
I
#
#
#
A
B
C
...
I
北京林业大学信息学院
2013年7月1日
串的模式匹配算法 算法目的:
确定主串中所含子串第一次出现的位置(定位) 即如何实现教材P72 Index(S,T,pos)函数
算法种类:
•BF算法(又称古典的、经典的、朴素的、穷举的)
•KMP算法(特点:速度快)
相关文档
最新文档