青岛理工大学数据结构课件第四章串
数据结构四PPT课件
pos len
堆分配存储特点:仍用一组连续的存储单元来存放串,
但存储空间是在程序执行过程中动态分配而得。
思路:利用malloc函数合理预设串长空间。
有的语言允许对串常量命名,以使程序易读、易写。 【例】C++中,可定义串常量path
const char path[]="dir/bin/appl";
5
练1:串是由
字符组成的序
列,一般0记个或多个
为 S=’a1a2……an’
练2:现。有以下4个字符串:
a =‘BEI’
b =‘JING’ c = ‘BEIJING’
数据结构课程的内容
第4章 串 (String)
1. 定义 2. 逻辑结构 3. 存储结构 4. 运算规则 5. 实现方式
4.1 串类型的定义
4.2 串的表示和实现 4.3 串的模式匹配算法
4.1 串类型的定义
串即字符串,是由零个或多个字符组成的有限序列,是数据 元素为单个字符的特殊线性表。
记为: s =‘ a1 , a2 , …….. , an’ (n≥0 )
讨论:想存放超长字符串怎么办?——静态数组有缺陷!
改用动态分配的一维数组—— “堆”!
例:用顺序存储方式实现求子串函数SubString(&Sub, S, pos,
len)
将串S中从第pos个字符开始长度为len的字符序列复 制到串Sub中(注:串Sub的预留长度与Ssub, SString S, int pos, int len )
d
= ‘问B:EI①JI他NG们’各自的长度? a =3,b =4,c = 7,d=8
② a是哪个串的子串?在主串中的位置是多少?
数据结构 第四章 章节重点概要
第四章串串是字符串的简称,可以将它看作一种特殊的线性表,其数据元素仅由一个字符组成。
计算机非数值处理的对象经常是字符串,如在汇编和高级语言的编译程序中,源程序和目标程序都是字符串数据;在事件处理程序中,顾客的姓名、地址、货物的产地、名称等,一般也是作为字符串处理的。
另外串还具有自身的特性,常常把一个串作为一个整体来处理,因此,一般线性表和串的操作有较大区别,本章主要讨论串的基本概念和存储结构,通过本章的学习,读者应掌握串的一些基本运算。
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 是一个串常量时称为串赋值,是一个串变量称为串拷贝)。
数据结构04
2.基本运算在顺序存储结构上的实现
在顺序存储结构中,串的类型定义描述如下:
#define MaxLen <最大串长>; //定义能处理的最大的串长度
typedef struct {
char str[MaxLen];
//定义可容纳MaxLen个字符的字符数组
int curlen;
//定义当前实际串长度
char data[4]; struct node *next; } lstring;
采用链式存储结构(结点大小为1),实现串的联接、求子串
以及串的置换基本运算见教科书 P83 。
2019/8/31
19
4.2.3 串的堆分配存储结构及其基本运算的实现
1.堆分配存储结构
堆存储结构的特点是,仍以一组空间足够大的、地址连续的 存储单元存放串值字符序列,但它们的存储空间是在程序执行过 程中动态分配的。所以也称为动态存储分配的顺序表。每当产生 一个新串时,系统就从剩余空间的起始处为串值分配一个长度和 串值长度相等的存储空间。
typedef struct Chunk {
//结点结构
char str[CHUNKSIZE];
struct Chunk *next;
} Lstring;
一个链串由头指针唯一确定。
这种结构便于进行插入和删除运算,但存储空间利用率太低。
为了提高存储密度,可使每个结点存放多个字符。通常将结
点数据域存放的字符个数定义为结点的大小,显然,当结点大小
}
}
return(0);
}2019/8/31
10
4.2 串的存储结构
串是一种特殊的线性表,其存储结构与线性表的存储结构 类似,只不过组成串的结点是单个字符。串的存储结构表示
2024版《数据结构》全套课件
将电路中的元件和连线抽象为图中的顶点和 边,利用图算法进行电路分析和优化。
路由算法
生物信息学
利用图数据结构表示计算机网络中的拓扑结 构,利用最短路径算法进行路网络、 基因调控网络等复杂生物系统,进行生物信 息学分析和挖掘。
05
查找与排序
查找的基本概念与分类
选择排序算法
简单选择排序
每次从待排序的数据元素中选出最小(或最大)的一个 元素,存放在序列的起始位置,直到全部待排序的数据 元素排完。
堆排序
利用堆这种数据结构所设计的一种排序算法,是选择排 序的一种。可以利用数组来模拟堆的结构,通过构造大 顶堆或小顶堆来实现排序。
归并排序算法
归并排序的思想
将两个(或更多)有序表合并成一个新的有序表,即把 待排序序列分为若干个子序列,每个子序列是有序的。 然后再把有序子序列合并为整体有序序列。
开放寻址法、链地址法等。
排序的基本概念与分类
排序的定义
将一组无序的记录序列调整为有序的记录序 列。
排序的分类
内部排序和外部排序,内部排序包括插入排 序、交换排序、选择排序、归并排序等。
插入排序算法
要点一
直接插入排序
每次将一个待排序的元素插入到前面已经排好序的序列中, 寻找合适的位置。
要点二
希尔排序
二叉树的遍历算法
先序遍历
先访问根节点,然后遍 历左子树,最后遍历右
子树。
中序遍历
先遍历左子树,然后访 问根节点,最后遍历右
子树。
后序遍历
层次遍历
先遍历左子树,然后遍 历右子树,最后访问根
节点。
按照层次顺序从上到下、 从左到右遍历二叉树中
的所有节点。
树和森林的遍历算法
栈和队列
12
第3章 栈和队列 第三章 栈和队列
while ((ch=getchar())!=‟\n‟) //从键盘输入字符,直到输入换行符为止 Push(&S ,ch); //将输入的每个字符入栈 while (!StackEmpty(S)) { //依次退栈并输出退出的字符 Pop(&S,&ch); putchar(ch); } putchar(„\n‟); }
23
第3章 栈和队列 第三章 栈和队列
3.2.2 括号匹配的检验 假设在一个算术表达式中,可以包含三种括号: 圆括号“(”和“)”,方括号“[”和“]”和花括号 “{”和“}”,并且这三种括号可以按任意的次序嵌 套使用。比如,...[...{...}...[...]...]...[...]...(...)..。现在需 要设计一个算法,用来检验在输入的算术表达式中 所使用括号的合法性。 算术表达式中各种括号的使用规则为:出现左 括号,必有相应的右括号与之匹配,并且每对括号 之间可以嵌套,但不能出现交叉情况。我们可以利 用一个栈结构保存每个出现的左括号,当遇到右括 号时,从栈中弹出左括号,检验匹配情况。在检验 过程中,若遇到以下几种情况之一,就可以得出括 24 号不匹配的结论。
19
第3章 栈和队列 第三章 栈和队列
下面我们将给出链栈各项基本操作的算法。 1. 初始化栈S
void InitStack(STACK *S) { S->top=NULL; }
20
第3章 栈和队列 第三章 栈和队列
2. 入栈 void Push(STACK *S,SElemType data) { p=(NODE*)malloc(sizeof(NODE)); if (!p) exit(OVERFLOW); else { p->data=data; p->next=S->top; S->top=p; } }
chapter4数据结构课件
Arrays
- static: the size of stack is given initially Linked lists - dynamic: never become full We will explore implementations based on array and linked list, if we use good programming principles the calling routines do not need to know which method is being used.
an an-1 a2 a1
top
an an-1 a2 a1
top
Status Pop(SqStack &s,SElemType &e)
Pop and return the element at the top of the stack Don‟t forget to decrement top
S.base = (SElemType *)realloc(S.base, (S.stacksize+ STACKINCREMENT)*sizeof(SElemType)); if (!S.base) exit(OVERFLOW); S.top = S.base + S.stacksize; S.stacksize += STACKINCREMENT;
Data Structure
Software College Northeast University
4
Data Structures -- Stacks
Attributes of Stack stacksize: the max size of stack top: the Address of the top element of stack base: points to structure storing elements of stack Operations of Stack IsEmpty: return true if stack is empty, return false otherwise IsFull: return true if stack is full, return false otherwise GetTop: return the element at the top of stack Push: add an element to the top of stack Pop: delete the element at the top of stack displayStack: print all the data in the stack
王道数据结构 第四章 串思维导图
第四章 串串定义串,即字符串(String)是由零个或多个字符组成的有限序列术语:串长、空串、空格串、子串、主串、字符在主串中的位置、子串在主串中的位置串[VS]线性表串的数据对象限定为字符集串的基本操作大多以“子串”为操作对象基本操作lndex(S,T),定位操作,找到串T在主串S中的位置StrCompare(S,T):比较操作。
若S>T,则返回值>0;若S=T,则返回值=0;若S<T,则返回值<0。
其他...字符集编码字符集英文字符―—ASClI字符集中英文―—Unicode字符集每个字符在计算机中对应一个二进制数,比较字符的大小其实就是比较二进制数的大小串的存储结构顺序存储静态数组动态数组malloc、free链式存储可让每个结点存多个字符,没有字符的位置用'#'或'\O'补足王道教材采用静态数组基于顺序存储实现基本操作求子串: bool SubString(SString &Sub,SString S, int pos, int len)串的比较:int StrCompare(SString S, SString T)求串在主串中的位置:int Index(sString S, SString T)串的模式匹配朴素模式匹配算法原理:暴力破解算法思想主串长度n,模式串长度m将主串中所有长度为m的子串与模式串比对找到第一个与模式串匹配的子串,并返回子串起始位置若所有子串都不匹配,则返回0最坏时间复杂度=O(nm)KMP算法不匹配的字符之前,一定是和模式串一致的依赖于模式串,与主串没有关系主要优点:主串指针不回溯用一个next数组存储模式串指针算法思想根据模式串T,求出next数组利用next数组进行匹配(主串指针不回溯)对于每模式串 t 的每个元素 t j,都存在一个实数 k ,使得模式串 t 开头的 k 个字符(t 0 t 1…t k-1)依次与 t j 前面的 k(t j-k t j-k+1…t j-1,这里第一个字符 tj-k 最多从 t 1 开始,所以 k < j)个字符相同。
数据结构第四章
T 插入串
S pos
T 插入后
A
A串部分被舍弃
MAXLEN
(3) 插入后串长(st+st+st≥MAXLEN且pos+st>MAXLEN,则A全部 字符被舍弃(不需后移),并且T在插入时也有部分字符被舍弃
S pos
A 插入前
S pos
T 插入后
MAXLEN 舍弃
T 插入串
S.ch 0 1 2 3 4 5 6 7 8 9 10 … abcde fgh i j k
st
MAXLEN-1 …
串的长度st+1
省级精品课程配套教材 高等学校计算机类“十二五” 规划2教. 在材串尾存储一个特殊字符作为串的终结符
比如C语言中用’\0’来表示串的结束。 char s[MAXLEN];
5 { /*连接后串长小于MAXLEN */
6 for(i=S->last; i<=S->last+st; i++)
7
S->ch[i+1]=T.ch[i-S->last];
8 S->last=S->last+st+1;
省级精品课程配套教材
高等学校计算机类“十二五”
规划教材
第四章 串
1.教学目的:
掌握串的定义、基本运算的实现及基本串匹配算法。
2.教学要求:
①理解串的七种基本运算的定义。 ②掌握利用这些基本运算来实现串的其它各种运算的方法。 ③掌握在顺序存储结构上实现串的各种操作的方法。 ④理解KMP算法,了解NEXT函数和改进NEXT函数的定义和计算。 ⑤理解串名的存储映象和在堆存储结构实现串操作的方法。
数据结构第4章PPT课件
• (13)StrDestroy(S):串销毁操作。销毁串S。
10
第10页/共33页
4.2 串的存储结构
4.1 串的定义及基本操作
• 串即字符串,计算机处理的对象分为数值数据和非数值数据,字符串是最基本的非数值数据。 • 字符串的应用非常广泛,它是许多软件系统(如字符编辑、情报检索、词法分析、符号处理、自然语言翻译
等系统)的操作对象。 • 在事务处理程序中,顾客的姓名和地址以及货物的名称、产地和规格等一般也是作为字符串处理的。字符
• 线性表的顺序和链式存储结构对于串都是适用的。但任何一种存储结构对于串的不同运 算并非都是十分有效的。
• 对于串的插入和删除操作,顺序存储结构是不方便的,而链式存储结构则显得方便些。 如果访问串中单个字符,对链表来说是不困难的;当要访问一组连续的字符时,用链式 存储结构要比用顺序存储结构麻烦。
11
9
第9页/共33页
串的基本操作
• (10)SubString(Sub,S,pos,len):求子串操作。若存在位置1≤pos≤StrLength(S)且 1≤len≤StrLength(S)-pos+1,则用Sub返回串S的第pos个字符起长度为len的子串。
• (11)StrIndex(S,T):串定位操作。若串S中存在和串T相同的子串,则返回它在串S中第一次出现的位 置;否则返回0。
•
同样存储S="
String Structure",用
紧凑格式一个地址能存四
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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 (S, T, pos)
初始条件: 初始条件:串S和T存在,T是非空串,1≤pos≤StrLength(S)。 条件 操作结果: 操作结果: 若主串 S 中存在和串 T 值相同的子串, 则返回它 返回它 中第pos个字符之后第一次出现的位置 个字符之后第一次出现的位置;否则函数 在主串 S 中第 个字符之后第一次出现的位置 值为0。
A
STUDENT’, =’GOOD GOOD’, STUDENT , t = GOOD , Index(S, T, pos) 返回子串T // 返回子串T在pos 之后的位置 Replace(&S, T,V) 用子串V替换子串T // 用子串V替换子串T 中没有t=’GOOD’ !) ( s中没有 中没有
StrCompare(SubString(S, i, StrLength(T)),T )
?0
i
S串 pos T 串 n-m+1 T 串
int Index (String S, String T, int pos) {
// T为非空串。若主串S中第pos个字符之后存在与 T相等的子串,则返回第一个 这样的子串在S中的位置,否则返回0
StrAssign(S, “Data Structure”) StrCopy(T, S) // T为“Data Structure” 为
DestroyString (&S)
初始条件:串 S 存在。 操作结果:串 S 被销毁。
StrEmpty (S) 初始条件:串S存在。 操作结果:若 S 为空串,则返回TRUE, 否则返回 FALSE。
SubString(&sub, s, 8, 7)= ‘STUDENT’ SubString(&sub, t, 2, 1)=‘O’ Index(s, ‘A’)= Index( s, t)= 3 0
<0 >0
StrLength (S) 初始条件:串 S 存在。 操作结果:返回 S 的元素个数, 称为串的长度。
Concat (&T, S1, S2) 初始条件:串 S1 和 S2 存在。 操作结果:用 T 返回由 S1 和 S2 联接而成的新串。
例如: 例如 Concat( T, ′man′, ′kind′) 求得 T = ′mankind′
StrInsert (&S, pos, T)
初始条件:串S和T存在, 1≤pos≤StrLength(S)+1。 操作结果:在串S的第pos个字符之前 插入串T。
例如:S = ′chater′,T = ′rac′, 例如: 则执行 StrInsert(S, 4, T)之后得到 S = ′character′
} // Index
复习: 复习:C语言中常用的串运算
处理字符串时, 注:用C处理字符串时,要调用标准库函数 #include<string.h> 处理字符串时 串比较:int strcmp(char s1,char s2); 串比较: 求串长: 求串长:int strlen(char s); 串连接: 串连接:char strcat(char to,char from) 子串T定位: 子串T定位:char strchr(char s,char c); // StrCompare(S,T) // StrLength(S) // Concat(&T, S1, S2) // Index(S, pos)
假设 S = ′abcaabcaaabc′, T = ′bca′ Index(S, T, 1) = 2; Index(S, T, 3) = 6; Index(S, T, 8) = 0;
Replace (&S, T, V)
初始条件:串S, T和 V 均已存在,且 T 是非空串。 操作结果:用V替换主串S中出现的所有与(模式串)T 相等的 不重叠的子串。
SubString (&Sub, S, pos, len)
初始条件:
串 S 存在,1≤pos≤StrLength(S) 且0≤len≤StrLength(S)-pos+1。
操作结果:
用 Sub 返回串 S 的第 pos 个字符起 长度为 len 的子串。
子串为“ 子串为“串” 中的一个字符子序列 例如: 例如: SubString( sub, ′commander′, 4, 3) ′ 求得 sub = ′man′ ; ′ SubString( sub, ′commander′, 1, 9) ′ 求得 sub = ′commander′; ′ SubString( sub, ′commander′, 9, 1) ′ 求得 sub = ′r′; ′
最 小 操 作 子 集
串的抽象数据类型定义
StrAssign(&T, chars) 串赋值,生成值为chars的串T chars的串 // 串赋值,生成值为chars的串T StrCompare(S,T) 串比较, S>T,返回值大于0 // 串比较,若S>T,返回值大于0… StrLength(S) 求串长,即返回串S // 求串长,即返回串S中的元素个数 Concat(&T, S1, S2) // 串连接,用T返回S1+S2的新串 串连接, 返回S1 S2的新串 S1+ SubString(&Sub, S, pos, len) // 求S中pos起长度为len的子串 pos起长度为len的子串 起长度为len …… Index(S, T, pos) //子串定位函数(最有价值),返回位置 //子串定位函数(最有价值),返回位置 子串定位函数 ), Replace(&S, T,V) 用子串V替换子串T // 用子串V替换子串T
gets(str) 输入一个串; puts(str) 输出一个串; strcpy(str1, str2, k) 串复制函数;
=’I 设 s =I q=’WORKER WORKER’。 q= WORKER 。求: 练习: 练习: StrLength(s) = StrLength(t) =
AM 14 4
即:这些操作不可能利用其他串操作来实现 不可能利用其他串操作来实现, 不可能利用其他串操作来实现 反之,其他串操作(除串清除ClearString和串 销毁DestroyString外)可在这个最小操作子 集上实现。
例如,可利用串比较、求串长和求子串等 操作实现定位函数Index(S,T,pos)。 算法的基本思想为: 算法的基本思想为:
}ADT String
C语言中已有类似串运算函数! 语言中已有类似串运算函数! 语言中已有类似串运算函数
StrAssign (&T, chars)
初始条件:chars 是字符串常量。 操作结果:把 chars 赋为 T 的值。
StrAssign(S, “Data Structure”)
StrCopy (&T, S) 初始条件: 存在。 初始条件:串 S 存在。 操作结果:由串 S 复制得串 T。 操作结果: 。
ClearString (&S) 初始条件:串S存在。 操作结果:将S清为空串。
在上述抽象数据类型定义的13种操作中,
串赋值StrAssign、 串复制 、 串复制Strcopy、 串赋值 、 串比较StrCompare、求串长 串比较 、求串长StrLength、 、 串联接Concat 求子串SubString 串联接 求子串 等六种操作构成串类型的最小操作子集。 等六种操作构成串类型的最小操作子集
s =‘ a1 , a2 , …….. , an’
串值( 括起来) 串名 串值(用‘ ’ 括起来)
(n≥0 )
隐含结束符‘/0 隐含结束符‘/0’ , ASCII码 即ASCII码NUL
为何要单独讨论“ 为何要单独讨论“串”类型? 类型?
字符串操作比其他数据类型更复杂(如拷贝、连接操作) 1) 字符串操作比其他数据类型更复杂(如拷贝、连接操作) 2) 程序设计中,处理对象很多都是串类型。 程序设计中,处理对象很多都是串类型。
StrDelete (&S, pos, len) 初始条件:串S存在 1≤pos≤StrLength(S)-len+1。 操作结果:从串S中删除第pos个字符 起长度为len的子串。 赋值 StrAssign(S, “Data Structure”)
子串删除 StrDelete(S, 3, 5) // “Daructure”
ADT String{ Objects: D={ai | ai∈CharacterSet, i=1, 2,…,n, n≥0} , Relations: R1={<ai-1,ai> | ai-1,ai ∈D, i=2, …,n} , functions: //至少有13种基本操作 至少有13 //至少有13种基本操作
例: 赋值 StrAssign(S, “Data Structure”)
子串置换 Replace(S, “a”, “b”) // S为“Dbtb Structure” 假设 S = ′abcaabcaaabca′,T = ′bca′ 若 V = ′x′, 则经置换后得到 S = ′axaxaax′ 若 V = ′bc′, 则经置换后得到 S = ′abcabcaabc′
空串和空白串有 无区别? 无区别?
串长: 串中字符的个数(n≥0) 串长: 串中字符的个数(n≥0). n=0 时称为空串 ∅ 。 时称为空串 空白串: 由一个或多个空格符组成的串。 空白串: 由一个或多个空格符组成的串。 空格符组成的串 子串: 子串:串S中任意个连续的字符序列叫S的子串; S叫主串。 任意个连续的字符序列叫 的子串; S叫主串。 序列叫S 子串位置:子串的第一个字符在主串中的序号。 子串位置:子串的第一个字符在主串中的序号。 有区别。 有区别。 字符位置:字符在串中的序号。 是指长度为零的串; 字符位置:字符在串中的序号。 是指长度为零的串; 空串(Null String)是指长度为零的串 空串(Null String) 串相等:串长度相等,且对应位置上字符相等。 串相等:串长度相等(Blank String),是指包含一个或多个空 而空白串(Blank String),是指包含一个或多个空 而空白串,且对应位置上字符相等。 白字符‘ 空格键)的字符串. 白字符‘ ’(空格键)的字符串. 个字符串: 例1:现有以下 个字符串: :现有以下4个字符串 a =‘BEI’ b =‘JING’ c = ‘BEIJING’ d = ‘BEI JING’ 他们各自的长度? =3, =4, 7, 问:① 他们各自的长度? a =3,b =4,c = 7,d=8 是哪个串的子串? ② a是哪个串的子串?在主串中的位置是多少? 是哪个串的子串 在主串中的位置是多少? a是c和d的子串,在c和d中的位置都是 是 和 的子串 的子串, 和 中的位置都是 中的位置都是1 是哪个串的子串? ③ b是哪个串的子串?在主串中的位置是多少? 是哪个串的子串 在主串中的位置是多少?