1 / 17

第四章 串

第四章 串. 4.1 串类型的定义 4.2 串的表示和实现 4.2.1 定长顺序存储表示 4.2.2 堆分配存储表示 4.2.3 串的块链存储表示. 4.1 串类型的定义 一、串和基本概念 串 (String) 是零个或多个字符组成的有限序列。一般记作 S= “ a 1 a 2 a 3 … a n ” ,其中 S 是串名,双引号括起来的字符序列是串值; a i (1≦i≦n) 可以是字母、数字或其它字符;串中所包含的字符个数称为该串的长度。长度为零的串称为空串 (Empty String) ,它不包含任何字符。

vea
Download Presentation

第四章 串

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第四章 串 • 4.1 串类型的定义 • 4.2 串的表示和实现 4.2.1 定长顺序存储表示 4.2.2 堆分配存储表示 4.2.3 串的块链存储表示

  2. 4.1 串类型的定义 一、串和基本概念 串(String)是零个或多个字符组成的有限序列。一般记作S=“a1a2a3…an”,其中S 是串名,双引号括起来的字符序列是串值;ai(1≦i≦n)可以是字母、数字或其它字符;串中所包含的字符个数称为该串的长度。长度为零的串称为空串(Empty String),它不包含任何字符。 通常将仅由一个或多个空格组成的串称为空白串(Blank String) 注意:空串和空白串的不同,例如“”和“”分别表示长度为1的空白串和长度为0的空串。

  3. 4.2.3 串的链式存储结构 顺序串上的插入和删除操作不方便,需要移动大量的字符。因此,我们可用单链表方式来存储串值,串的这种链式存储结构简称为链串。 typedef struct node{ char data; struct node *next; }lstring; 一个链串由头指针唯一确定。 这种结构便于进行插入和删除运算,但存储空间利用率太低。

  4. 为了提高存储密度,可使每个结点存放多个字符。通常将结点数据域存放的字符个数定义为结点的大小,显然,当结点大小大于 1时,串的长度不一定正好是结点的整数倍,因此要用特殊字符来填充最后一个结点,以表示串的终结。 对于结点大小不为1的链串,其类型定为义只需对上述的结点类型做简单的修改即可。 #define nodesize 80 typedef struct node{ char data[nodesize]; struct node *next; }lstring;

  5. 4. 1 串的基本概念 2 串的有关术语 1)子串 串中任意连续的字符组成的子序列称为该串的子串;例:c = “ DATA STRUCTURE”,f=“DATA” f是c的子串 2)子串的位置 子串t 在主串S中的位置是指主串s 中第一个与T相同的子串的首字母在主串中的位置; 例:s=“ababcabcac” , t=“abc” 子串T 在主串S中的位置为3 3)串相等 两个串相等,当且仅当两个串长度相同,并且各个对应位置的字符都相同;

  6. 4. 1 串的基本操作 • 3 串的基本操作串的逻辑结构与线性表一样,都是线性结构。但由于串的应用与线性表不同,串的基本操作与线性表有很大差别。 • 1)串赋值操作assign( s, t) 功能:将串t 的值赋给串变量s ; • 2)串相等判断 equal(s,t) 函数 • 串的联接操作 concat( s , t ) 把串t 接在串 s 后面 • 求串长操作 lenght(s) • 5) 求子串操作sub ( s, start, len, t) 若 • 0<=start<length(s) 0<=len<=length(s)-start • 则t 中值为从串s 的第start个字符, 起长度为len 的字符序列, 并且函数返回值为1, 否则为0;

  7. 三、串的基本操作 对于串的基本操作,许多高级语言均提供了相应的运算或标准库函数来实现。下面仅介绍几种在C语言中常用的串运算,其它的串操作见的文件。 定义下列几个变量: char s1[20]=“dirtreeformat”,s2[20]=“file.mem”; char s3[30],*p; int result; • 求串长(length) int strlen(char s); //求串的长度 例如:printf(“%d”,strlen(s1)); 输出13

  8. (2)串复制(copy) char *strcpy(char to,char from); 该函数将串from复制到串to中,并且返回一个指向串to的开始处的指针。 例如:strcpy(s3,s1); //s3=“dirtreeformat” (3)联接(concatenation) char strcat(char to,char from) 该函数将串from复制到串to的末尾,并且返回一个指向串to的开始处的指针。 例如:strcat(s3,”/”) strcat(s3,s2); //s3=“dirtreeformat/file.mem”

  9. 上述串的操作是最基本的,其中后四个还有变种形式:strncpy,strncat,strncmp,strnchr。串的其余操作可由这些基本操作组合而成。上述串的操作是最基本的,其中后四个还有变种形式:strncpy,strncat,strncmp,strnchr。串的其余操作可由这些基本操作组合而成。 例1、求子串 求子串的过程即为复制字符序列的过程,将串S中的第pos个字符开始长度为len的字符复制到串T中。 void substr(string sub,string s,int pos,int len) { if(pos<0 || pos>strlen(s)-1 || len<0) error(“parameter error”) strncpy(sub,&s[pos],len); }

  10. (4)串比较(compare) int strcmp(chars1,char s2); 该函数比较串s1和串s2的大小,当返回值小于0,等于0或大于0时分别表示s1<s2\s1=s2或s1>s2 例如:result=strcmp(“baker”,”Baker”) result>0 result=strcmp(“12”,”12”); result=0 result=strcmp(“Joe”,”Joseph”); result<0 (5)字符定位(index) char strchr(char s,char c); 该函数是找c在字符串中第一次出现的位置,若找到则返回该位置,否则返回NULL。 例如:p=strchr(s2,”.”); p 指向“file”之后的位置 if(p) strcpy(p,”.cpp”); s2=“file.cpp”

  11. 4. 1 串的基本概念 • 下面是一些串的例子:(1)a = “This is a string” • (2)b = “string” • (3)c = “ “(4)d = “”(5)e = “你好” • 说明: • 串中包含的字符个数,称为串的长度。 长度为0的串称为空串,它不包括任何字符; • 串中所包含的字符可以是字母、数字或其他字符,这依赖于具体计算机所允许的字符集。

  12. 3 串的基本操作串的逻辑结构与线性表一样,都是线性结构。但由于串的应用与线性表不同,串的基本操作与线性表有很大差别。 • 1)串赋值操作assign( s, t) 功能:将串t 的值赋给串变量s ; • 2)串相等判断 equal(s,t) 函数 • 串的联接操作 concat( s , t ) 把串t 接在串 s 后面 • 求串长操作 lenght(s) • 5) 求子串操作sub ( s, start, len, t) 若 • 0<=start<length(s) 0<=len<=length(s)-start • 则t 中值为从串s 的第start个字符, 起长度为len 的字符序列, 并且函数返回值为1, 否则为0; • 6)求子串位置操作index( s, t ) 功能:如果s中存在与 t 相同的子串, 则返回s中第1个这样的子串的位置,若不存在返回0 4. 1 串的基本概念

  13. 7) 替换操作 replace( s, t ,v ) 功能:由串v 替换串s 中出现的所有和 t 相同的不重叠子串;8)复制串操作 strcopy(s, t) 功能:由串变量 s 复制得到串变量 t ; 9)判空操作 empty( s ) 功能:若为空串,则返回1,否则返回0 10)串置空操作 ClearString( s ) 功能:将s 清为空串 11) 串插入操作 StrInsert( s, start , t) 功能:将串t 插入到串s 的第start 字符之前 12)串删除操作 StrDelete( s, start , len) 功能:从串s 中删除第 start 个字符起长度len 为的子串 4. 1 串的基本概念

  14. ch d a t a s t r u c t u r e \0 0 1 2 3 4 5 6 7 8 9 10 11 14… MAX-1 1 顺序存储结构 顺序存储结构类似于C语言的字符数组,以一组地址连续的存储单元存放串值字符序列,其类型说明如下: #define MAX 255 char ch[MAX] 4.2 串存储和实现 在数组ch中以字符‘\0’表示字符串的结束. 特点是访问容易, 但删除或插入麻烦

  15. d a t a s t r u c t u r e♀♀♀ head d a t e head 4.2 串存储和实现 2 链式存储结构 链式存储结构类似线性链表,由于串结构的特殊性, 要考虑每个结点是存放一个字符还是多个字符。一个字符的,插入、删除、求长度非常方便,但存储效率低。 多个字符的,改善了效率,在处理不定长的大字符串时很有效,但插入、删除不方便,可用特殊符号来填满未充分利用的结点。

  16. 串名 起址 串长 a 0 4 b 4 9 c 13 4 …. d a t a s t r u c t u r e b o o k free=17 3、堆分配存储 堆分配存储类似于线性表的顺序存储结构,以一组地址连续的存储单元存放串值字符序列,其存储空间是在程序执行过程中动态分配的。 一个串值的确定是通过串在堆中的起始位置和串的长度实现的。为此,串名与串值之间要建立一个对照表。 char store[MAX]; int free ; */ 整型域:存放串长*/ 0 1 2 3 4 5 6 7 8 9

  17. 4.3 串的模式匹配算法 子串定位运算又称为模式匹配(Pattern Matching)或串匹配(String Matching),此运算的应用在非常广泛。例如,在文本编辑程序中,我们经常要查找某一特定单词在文本中出现的位置。显然,解此问题的有效算法能极大地提高文本编辑程序的响应性能。

More Related