串的定义及基本运算

合集下载

数据结构第5章 串和广义表

数据结构第5章 串和广义表

5.1 串的定义和基本运算
• (4)串的连接StrCat(S,T)。 • 初始条件:串S和T存在。 • 操作结果:将串T的值连接在串S的后面。 • (5)求子串SubString(Sub,S,pos,len)。 • 初始条件:串S存在,1≤pos≤StrLength(S)且
1≤len≤StrLength(S)-pos+1。 • 操作结果:用Sub返回串S的第pos个字符起长度为len的
1≤len≤StrLength(S)-pos+1。 • 操作结果:从串S中删除第pos个字符起长度为len的子串。 • (9)串的替换StrReplace(S,T,V)。 • 初始条件:串S,T和V存在,且T是非空串。 • 操作结果:用V替换串S中出现的所有与T相等的不重叠子
串。 • (10)判断串空StrEmpty(S)。 • 初始条件:串S存在。 • 操作结果:若串S为空串,则返回1;否则返回0。
• (1)非紧凑存储。设串S="Hello boy",计算机字长为32 位(4个Byte),用非紧凑格式一个地址只能存一个字符, 如图5-2所示。其优点是运算处理简单,但缺点是存储空 间十分浪费。
• (2)紧凑存储。同样存储S="Hello boy",用紧凑格式一 个地址能存四个字符,如图5-3所示。紧凑存储的优点是 空间利用率高,缺点是对串中字符处理的效率低。
•}
5.3 串的基本运算的实现
• (3)求子串操作。求串S从第pos位置开始,长度为len的 子串,并将其存入到串Sub中。操作成功返回1,不成功 返回0。其算法描述如下:
• int SubString(String *S,String *Sub,int pos,int len)

串的定义及其基本运算

串的定义及其基本运算
一个长度为零的串称为空串,表示为s =ˊˊ。
空格也是合法字符,它可以出现在较长的字符 串中,也可以单独出现 。例如A=ˊabc def ˊ就是 长度为7的字符串,因为abc和def中间有一个空 格字符。

串的基本运算
1. 求串的长度len(s); 2. 判断两个串是否相等equal(s,t); 3. 两个串的连接concat(s,t); 4. 求某串的子串sub(s,start,ln,t); 5. 插入子串insert(s1,i,s2); 6. 删除子串delete(s,i,j); 7. 置换replace(s,t,r)。
返回

数据结构
数据结构
1.1 串的定义
串(string)是由有限个字符组成的序列,又称为 字符串(character string),一般记为:
s=ˊa1 a2 a3…anˊ 其中s是串名,用单引号括起来的字符序列是串 的符值;。 n为ai串(1<中=字i<=符n)的可个以数是,字称母为、串数的字长或度其。他字

串的定义和基本运算(精)

串的定义和基本运算(精)
s1->str=(char*)malloc(sizoef(char));s1->str[0]=’\0’;s1>length=0;return ERROR;} s1->str=(char*)malloc((len+1)*sizeof(char)); if (!s1.str) return ERROR; s1->str[0..len-1]=s2.str[start-1..start+len -2]; s1->str[len]=’\0’; s1->length=len; return OK; }
int length;
}STRING; 不同的定义形式,算法中的处理也略有不同。下 面我们将给出在第二种顺序存储方式下串的几个基本 操作的算法。
(1) 串的赋值 int StringAssign(STRING*s,char *string_constant) { if (s->str) free(s->str);
2. 链式存储结构
由于串结构中每个数据元素为一个字符,所以最 直接的链式存储结构是每个结点的数据域存放一个字 符。举例:
S
s
t r i n g^
图 4-1
优点是操作方便;不足ቤተ መጻሕፍቲ ባይዱ处是存储密度较低。所 谓存储密度为:
串值所占的存储单元 存储密度
实际分配的存储密度
若要将多个字符存放在一个结点中,就可以缓解 这个问题。举例:
(4)串连接 int Concat(STRING *s1,STRING s2) { STRING s; StringAssign(&s,s1->str); //将s1原来的内容保留在s中 len=Length(s1)+Length(s2);

数据结构第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;

第5章-串

第5章-串
7. 串删除 StrDel (s,i,len) 操作条件:串s存在 操作成果:删除串s 中第i个字符起长度为len旳
子串,s旳串值变化。
5-2 串旳表达和实现
一.串旳顺序存储
1.存储方式:同一般旳线性表旳顺序存储构 造完全相同.用一组地址连续旳存储单元存 储字符序列, 据预定义大小,为每个定义旳串 变量分配一种固定长度旳存储区。
2.索引存储旳例子 设字符串:A=”Red” B=”Yellow” C=”Blue” D=”White” 用指针free指向堆中未使用空间旳首地址。
索引表: Name A B C D ……
Length 3 6 4 5 ……
Stradr 0 3 9
……
free 堆:
R e d Y e l l o w B l u E Wh i t e …
为 len 旳子串。而且赋予给s2,len=0得到旳是空串。 【例5-7】 SubStr ("abcdefghi",3,4) = "cdef”
4. 串比较: Strcmp (s1,s2) 操作条件:串s1,s2存在。 操作成果:若s1= =s2,返回值为0;若s1<s2, 返
回值<0;若s1>s2, 返回值>0。
(2)使用gets() 函数
格式为:gets(字符数组名); 【例5-3】 char str[10]; printf("Input your str: "); gets(str);
•使用gets ()方式输入时,字符串中允许具有空
格。
2.字符串旳输出
字符串旳输出也有两种措施:
(1)使用printf () 函数 使用printf () 函数时,输出格式中要设置"%s",再
止符,以此表达串旳结尾。例如C语言中处理定长串旳措施

第5章 串

第5章 串

【例5-8】子串定位 例 IndexStr ("abcdebda","bc")=2 " "" " IndexStr ("abcdebda","ba")= 0 " "" " 6. 串插入 InsStr (s,t,i) 操作条件: , 存在 操作条件:串s,t存在 操作结果:将串 插入到串 的第i个字符前 的串值发 插入到串s 个字符前, 操作结果:将串t插入到串 的第 个字符前,s的串值发 生改变. 生改变. 7. 串删除 DelStr(s,i,len) 操作条件: 存在 操作条件:串s存在 操作结果:删除串 中第i个字符起长度为 的子串, 个字符起长度为len的子串 操作结果:删除串s 中第 个字符起长度为 的子串,s 的串值改变. 的串值改变.
5-1-2 串的输入与输出 1.字符串的输入 . 语言中, 在C语言中,字符串的输入有两种方法: 语言中 字符串的输入有两种方法: (1)使用 )使用scanf () 函数 使用scanf () 函数时,输入格式中要设置"%s", 函数时,输入格式中要设置" ", 使用 再加上字符数组名称. 再加上字符数组名称. 【例5 - 2 】 char str[10]; printf(" printf("Input your str: "); scanf("%s" scanf("%s",str); 使用 使用scanf ()方式输入时,字符串中不能含有空格. 方式输入时, 方式输入时 字符串中不能含有空格. 在C++中还可以用输入流对象cin . C++中还可以用输入流对象 中还可以用输入流对象cin

第五章 字符串

第五章  字符串

(5)StrIndex(a,b) 功能:求子串b在主串a中第1次出现的第1 功能:求子串b在主串a中第1次出现的第1个字 符在a中的序号,若b不是a 符在a中的序号,若b不是a的子串,则返回 -1。 例如: b=“+”,求StrIndex(a,b)。 例如:a=“a+b+c”, b=“+”,求StrIndex(a,b)。 结果: 结果 StrIndex(a,b)=2 (6)StrEqual(a,b) 功能:判断串a和串b是否相等,相等返回1 功能:判断串a和串b是否相等,相等返回1, 否则返回0 否则返回0。 例如: b=“chald”,求StrEqual(a,b)。 例如:a=“child”, b=“chald”,求StrEqual(a,b)。 结果:返回0 结果:返回0。
(2)求子串的运算及其算法 (2)求 //用sub返回串s中从第m个字符开始至第n个字符为止的 //用sub返回串s中从第m个字符开始至第n 子串。1<=m<=n<=s.len子串。1<=m<=n<=s.len-1 int SubStr_h(hstring s,int m,int n,hstring &sub) { int k,j; if(sub.ch) delete sub.ch;//释放sub原有的空间 sub.ch;//释放sub原有的空间 if(m<0||n>s.lenif(m<0||n>s.len-1||m>n) return 0;//参数错误 0;//参数错误 else// { k=n-m+1; sub.ch=new char[k]; j=0;//分配sub空间 k=nj=0;//分配sub空间 for(k=m;k<=n;k++)//将子串拷贝到sub串中 for(k=m;k<=n;k++)//将子串拷贝到sub串中 {sub.ch[j]=s.ch[k]; j++;} } sub.len=nsub.len=n-m+1;return 1;//保存sub串的长度 1;//保存sub串的长度 }

数据结构 第2章 串

数据结构 第2章 串

if(j==m) return(i);
} return(-1);
算法评价: 比较总次数:m*(n-m+1) 时间复杂度:O(m*(n-m))
}
若n>>m:O(m*n)
2)匹配算法——KMP算法
t= aaabcaaadcaaadaaaabc p= aaada
算法:如果存在一个整数k(k<j),使得模式P中 开头k个字符与前面k个字符相同,则只要从 模式P中的p[k]开始与正文T中的t[i]开始比较, 就可以省去前面的k次比较。
01 2 3 4 5
m x不在p中,或只在末尾 1)求d(x)
m-i-1 否则
2)不匹配,向右移d(x)(对应后,从最后一个字符比较) 匹配,取i-m+1
0 1 2 3 4 5 6 7 8 9 10 12 14 16 18 20 22
2) 非紧缩格式是以一个存储单元为单位, 也就是一个存储单元
中仅放一个字符。 在一个程序中使用的串变量较少, 且各串变 量的长度又都较短时,如果希望该程序处理字符的速度尽可能 快, 那么选择非紧缩格式比较合适。 在这种存储格式中, 串的长 度是隐式的, 串所占用存储单元的个数即为串长。
例: 假设一存储单元可以存放4个字符, 同样 对于字串(This is a flag), 共需14个存储单元, 其存放的直观表示如表 4.2。 这种存储格式 对存储空间的利用率仅为25%, 但如上所述, 该方法在字符加工处理方面会节省时间。
2、算法: 回溯法(朴素的模式匹配法) KMP算法 BM算法
1) 回溯法 成功匹配:返回首次出现的起始位置
失败匹配:返回-1
匹配算法——简单算法
t=“abcdabcdabccdacd”

数据结构——串

数据结构——串

7
三、串的基本操作 C语言中常用的串运算 定义下列几个变量: char s1[20]=“dirtreeformat”,s2[20]=“file.mem”; char s3[30],*p; int result;
(1) 求串长(length) int strlen(char s); //求串的长度
例如:printf(“%d”,strlen(s1)); 输出13
char strcat(char s1 , char s2)
该函数将串s2复制到串s1的末尾,并且返回一 个指向串s1的开始处的指针。
例如:strcat(a3,”/”)
strcat(a3,a2);
2020//4//a143=“dirtreeformat/file.mem”
9
(4)串比较(compare)
A=“This is a string” B=“is” B在A中出现了两次,其中首次出现所对应的主串
位置是3。因此,称B在A中的序号(或位置)为3 特别地,空串是任意串的子串,任意串是其自身的子
串。
2020/4/14
5
二、串的抽象数据定义
• ADT String { • 数据对象:D={ai| ai
16
顺序串的类型定义和顺序表类似: typedef char ElemType;
typedef struct { ElemType ch[maxstrlen]; int length;
}sstring; //其优点是涉及到串长操作时速度快。
2020/4/14
17
4.2.2 堆分配存储表示
这种存储表示的特点是,仍以一组地址连续的存储单元存 放字符串序列,但它们的存储空间是在程序执行过程中动态 分配而得。所以也称为动态存储分配的顺序表。在C语言中, 利用malloc和realloc,free等动态存储管理函数,来根据实 际需要动态分配和释放字符数组空间。这样定义的顺序串类

串的定义及基本运算

串的定义及基本运算
同的情况,即此趟比较不成功,将主串的指针指向本
趟比较开始位置的下一个字符(i=i-j+2) ,同时将
子串的位置返回到第一个位置。
进行下次比较,直到匹配成功或者主串已经结束。
2020年1月30日
17
• 算法举例
主 串 S abbaba 子 串 T aba
第1趟 S a b b a b a T aba
3. 设定长串存储空间:char s[MAXSIZE+1]; 用s[0] 存放串的实际长度,串值存放在s[1]~s[MAXSIZE],字 符的序号和存储位置一致,应用更为方便。
2020年1月30日
10
4.2.2 定长顺序串的基本运算
第四章 串
1.串联接:把两个串s1和s2首尾连接成一个新串s 。 int StrConcat1(s1,s2,s) { int i=0 , j, len1, len2;
(ii)在最坏的情况下,如果不成功的匹配都发生在子 串(t)的最后一个字符的位置,即每趟比较都要进行 m 次,这样比较的趟数要 n 趟,因此,此情况下的时 间复杂度为 O(n*m)。
例如:s="aaaaaaaaaab"
t="aaaab"
2020年1月30日
20
第四章 串
算法分析 优点:算法简单 实现容易 缺点:算法复杂度高; 重复比较次数比较,只要不匹配的情况,要 从新开始;回溯次数比较多。
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相等

串的基本操作

串的基本操作

1上机实训3:串的基本操作一、实训目的通过实训,掌握串的运算(赋值,比较,联结,插入子串,模式匹配……等)二、实验理论知识1)串的基本概念及其含义串( string)是由零个或多个字符组成的有限序列,一般记作:s='a1a2…an'(n≥0),其中s为串的名字,用单引号括起来的字符序列为串的值;ai(1≤i≤n)可以是字母、数字或其它字符(取决于程序设计语言所使用的字符集);n为串中字符的个数,称为串的长度。

2)串的存储表示及其实现●顺序存储可以用一组地址连续的存储单元依次存放串的各个字符,这是串的顺序存储结构,也称为顺序串●链式存储和线性表的链式存储结构相类似,也可采用链表方式存储串值。

串的这种链式存储结构简称为链串。

用链表存储字符串,每个结点需要有两个域:一个数据域(data)和一个指针域(Next),其中数据域存放串中的字符,指针域存放后继结点的地址。

3)模式匹配问题三、实训案例与分析【实例1】串的存储与基本运算【实例分析】在本实例中练习计算字符串的长度、字符串的复制、字符串的比较、字符串的连接、字符串的插入等基本操作。

在设计时1)编写一个菜单函数,根据不同情况做(1-5)不同选择。

2)如果选择1,即要求计算输入字符串的长度。

3)如果选择2,完成字符串的复制。

4)如果选择3,完成字符串的比较。

5)如果选择4,完成两个字符串的连接。

6)如果选择5,字符串的插入。

【参考程序】#include <stdio.h>#define MAX 128typedef enum {fail,success} status;typedef enum {false,true} boolean;main(){ int strlen();void strass();boolean strcmp();status strcat( );status strins();int t,n,i;boolean b;status st;char s[MAX],s1[MAX],s2[MAX];printf("\n1. The length of string\n");printf(" 2. The assignment of string\n");printf(" 3. A string compare with another string:\n"); printf(" 4. A string connect with another string:\n"); printf(" 5. A string to be inserted into another string\n"); printf(" Please input a operation:");/*输入操作选项*/ scanf("%d",&t);switch(t){case 1:printf("please input a string:\n");getchar();gets(s);n=strlen(s);printf("the length is: %d",n);break;case 2:printf("please input the first string:\n");getchar();gets(s1);printf("please input the second string:\n");getchar();gets(s2);strass(s1,s2);break;case 3:printf("please input the first string:\n"); getchar();gets(s1);printf("please input the second string: \n"); gets(s2);b=strcmp(s1,s2);if (b==true)printf("equal\n");elseprintf("not equal\n");break;case 4:printf("please input the first string:\n"); getchar();gets(s1);printf("please input the second string:\n"); gets(s2);st=strcat(s1,s2);if(st==success)printf("answer is %s\n",s1);elseprintf("error!\n");break;case 5:printf("please input the first string:\n"); getchar();gets(s1);printf("please input the second string:\n"); gets(s2);printf("please input i:");scanf("%d",&i);st=strins(s1,i,s2);if(st==success)printf("answer is: %s\n",s1);else printf("error!\n");break;case 0:break;default: printf("There isn't this operation!");}}int strlen(s) /*求字符串的长度子函数*/char s[];{ int i;for(i=0;s[i]!='\0';i++);return (i);}void strass(s1,s2)char s1[],s2[];{ int i=0;while(s1[i]!='\0'){ s2[i]=s1[i];i++;}s2[i]='\0';printf("s2 is %s",s2);}boolean strcmp(s1,s2) /*字符串比较子函数*/ char s1[],s2[];{ int i=0;while (s1[i]==s2[i] && s1[i]!='\0' && s2[i]!='\0') i++;if (s1[i]=='\0' && s2[i]=='\0')return (true);elsereturn (false);}status strcat (s1,s2) /*字符串连接子函数*/char s1[],s2[];{ int i,j,k;i=strlen(s1);j=strlen(s2);if((i+j)>=MAXN)return(fail);for(k=0;k<=j;k++)s1[i+k]=s2[k];return (success);}status strins (s1,i,s2)char s1[],s2[];int i;{ int m,n,k;m=strlen(s1);n=strlen(s2);if (i<0||i>m||(m+n)>MAXN )return (fail) ;for(k=m;k>=i;k--)s1[k+n]=s1[k];for(k=0;k<n;k++)s1[i+k]=s2[k];return (success);}【测试数据与结果:】计算字符串的长度1. The length of string2. The assignment of string3. A string compare with another string:4. A string connect with another string:5. A string to be inserted into another string Please input a opertation:1please input a string:you are a boy!the length is: 14字符串的复制1. The length of string2. The assignment of string3. A string compare with another string:4. A string connect with another string:5. A string to be inserted into another string Please input a opertation:2please input the first string:you are a boy!please input the second string:i am a girl!s2 is you are a boy!字符串的比较1. The length of string2. The assignment of string3. A string compare with another string:4. A string connect with another string:5. A string to be inserted into another string Please input a opertation:3please input the first string:you are a boy!please input the second string:i am a girl!not equal字符串的连接1. The length of string2. The assignment of string3. A string compare with another string:4. A string connect with another string:5. A string to be inserted into another stringPlease input a opertation:4please input the first string:you are a boy!please input the second string:i am a girl!answer is:you are a boy!i am a girl!字符串的插入1. The length of string2. The assignment of string3. A string compare with another string:4. A string connect with another string:5. A string to be inserted into another stringPlease input a opertation:5please input the first string:you are a boy!please input the second string:i am a girl!please input i:2answer is i am a girl! you are a boy!【实例2】统计主串指定单词在主串中出现的次数和位置【实例描述】统计主串指定单词在主串中出现的次数和位置,要求:1)输入以回车作为结束符的一串字符作为主串;2)求主串中指定单词出现的次数和位置,注意单词与子串的区别;【实例分析】假设num存放出现次数,初始化为0,position[i]存放每一次匹配时的位置。

串的定义及其基本运算

串的定义及其基本运算
例如操作前:s1="he",s2=" bei",
则操作结果是s1="he bei"
(4)串比较 strcmp(s1,s2); 操作结果:若s1==s2,返回值为0;若s1<s2, 返回值<0;若 s1>s2, 返回值>0。
result= strcmp("abc","Abc");/* result>O */
5页
2020/9/19
数据结构(C语言版)
第5章 串
(2)串拷贝strcpy (s1,s2) ; 执行操作:将s2的串值赋值给s1。 操作结果:串s1的值与串s2的值相等,s1原来的值被覆盖掉。 例如 strcpy (str3,str1)
(3)连接操作 :strcat (s1,s2) ; 操作结果:将字符串s2连接 在s1的后面,s2不改变。
例如:substr(str1, str3,5,3),则str3="bin"
再例如:substr(str1, str3,14,3),则str3=NULL
(6)子串定位 strindex(s,t);找子串t在主串s中首次出 现的位置
操作结果:若t∈s,则操作返回t在s中首次出现的位置, 否则返回值为-1。
串的链式存储结构简称为链串。其结点数据域为单个
子串的位置:子串在主串中首次出现时,该子串的 首字符对应主串的序号称为子串在主串中的位置。
例如,设A和B分别为
A="This is a string”,B ="is“
则B是A的子串,A为主串。且位置是3。
4页
2020/9/19
数据结构(C语言版)
第5章 串
特别规定,空串是任意串的子串,任意串是其自身 的子串。 串相等:两个串相等,是指两个串的长度相等且对 应字符都相同。

算法与数据结构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
字符串的替换

第四章_串

第四章_串
字符开始取长为 len 的子串。 ⑸ StrCmp (s1, s2):串比较,若s1=s2,返回0;
若s1<s2, 返回-1;若s1>s2, 返回1。 ⑹ StrIndex (s, t):定位,返回子串t在主串s中首
次出现的位置。若t不是s的子串,则返回0。
串的基本运算
⑺ StrInsert (s, i, t):插入,将串t插入到串s 中的第i个位置。
(1)非压缩形式
first
a
b
g∧
串的存储结构
(2)压缩形式
first
abcd
efg ∧
串的运算实现
模式匹配:给定主串S="s1s2…sn"和模式 T="t1t2…tm",在S中寻找T 的过程称为模式匹 配。如果匹配成功,返回T 在S中的位置,如果 匹配失败,返回0。 假设串采用顺序存储结构,串的长度存放在数组 的0号单元,串值从1号单元开始存放。
第4章 串
串的基本概念
▪ 串:零个或多个字符组成的有限序列。 ▪ 串长度:串中所包含的字符个数。 ▪ 空串:长度为0的串,记为:" "。 ▪ 非空串通常记为: ▪ S=" s1 s2 …… sn "
其中:S是串名,双引号是定界符,双引号 引起来的部分是串值 ,si(1≤i≤n)是一个 任意字符。
串的基本概念
i
第 ababcabcacbab
1
趟 abcac
i=3,j=3失败;
j
i回溯到2,j回溯到1
串的运算实现
例:主串S="ababcabcacbab",模式T="abcac"
i
第 ababca c i=2,j=1失败

第四章 串

第四章 串

第 4章 串
• void assign(SeqString *s, char t[]) { int i=0; while (t[i]!='\0') { s->str[i]=t[i]; i++;
}
s->str[i]='\0'; s->len=i;
}
第 4章 串
• void strcopy(SeqString *s, SeqString t) { int i; for (i=0;i<=t.len;i++) s->str[i]=t.str[i]; s->len=t.len; } •
第 4章 串
4.2.2 串的链式存储结构
• 由于串的特殊性——结构中的每个数据元素是一个字
符;
• 使用链表存储串值时,每个结点可以存放一个字符, 也可以存放多个字符,结点中存放字符的个数称为“
结点大小”。
• 图4.2(a)是结点大小为3的链表
head a b c e f g h i j ^
head
第 4章 串
简单模式匹配算法
• int StrIndex (SeqString *S, SeqString *T ) { int i, j ; i=0 ; j=0 ; /注从字符数组的第0个字符开始比 while(i<S->len && j<T->len )
/*字符比较成功,继续比较后续字符*/
if (S->str[ i ] == T->str[ j ]) {i++;j++ ;} /*字符比较不成功,i指针回溯,并充T的第一个字符起重新比较*/

第四章 串

第四章 串

4.2 串的存储结构
一、串的顺序存储结构
1. 类型定义
#define maxlen 100 typedef struct { char data[maxlen+1]; int len; }SeqString; data[maxlen]存放结束标志‘\0‟
2、顺序串的常用运算: (1)串连接 concat ( s, t) 把串 s 和 t 联接在一起,形成的新串。
4.2 串的存储结构
(3)子串的插入 insert(s, pos, t ) 在串 s 的第 pos 个字符之前插入串 t。
int insert(SeqString * s, int pos, SeqString * t ) { int i; if(t->len==0) { printf(“空串!\n”); return 0 ; } if(pos<1 || pos>s->len+1) {printf(“位置错!”);return 0;} if(s->len+t->len>maxlen) {printf(“溢出!”);return 0;} for(i=s->len; i>=pos-1; i--) s->data[i+ t->len]=s->data[i]; for(i=0;i<t->len;i++) s->data[pos-1+i]=t->data[i]; s->len = s->len+ t->len return 1; }
4.2 串的存储结构
(2)求子串 substring (s, pos, len) 求串s的第 pos 个字符起长度为 len 的子串。

chapter 4 串1

chapter 4 串1

Chapter 4 串4.1 串的定义及其运算4.2 串的表示和实现4.3 串的模式匹配算法4.4 串的应用——文本编辑本章重点:1. 串的定义及基本操作的确切含义。

2. 串的存储结构(顺序、链式)的描述方法。

3. 串的模式匹配算法,尤其是KMP 算法中next 函数的定义及如何计算给定模式串的next 函数值。

本章难点:1. 在串的顺序存储结构上实现串的各种操作的方法。

2. 串匹配的KMP 算法。

4.1 串的定义及其运算一、串的基本概念1.字符(Char ):字母、数字、其它符号。

2.串(String ):由n(n ≥0)个字符组成的有限序列。

记为:S=“a 0a 1…a n-1”。

其中,S 是串的名,称为串名,a 0a 1…a n-1是串的值,称为串值。

串中字符的数目称为串的长度。

名值名值A=“1234”S=“abcde”例:注意:双引号“和”不属于S 的值,其作用只是为了避免与其他符号混淆。

3.空串(Null String ):不含任何字符的串。

用“”或Φ表示。

其长度为0。

4.空格串(Blank String ):仅含空格字符的串(即由一个或多个空格字符组成的串)。

例:长度为2的空格串记作“”或“φφ”5.子串(Substring ):串中的一个连续字符子序列叫做该串的一个子串。

对应地,该串就称为主串。

例:A=“123456”,B=“456”,C=“46”B 为A 的子串,A 为主串;C 不是A 的子串。

二、串的基本运算1.初始化Initiate(S)2.赋值Assign(S, T)例:T=“DATA”,则执行Assign(S,T)后,S 的值就等于“DATA”。

注:后一个参数可为串变量名,也可为字符序列。

3.求长度Length(S)4.比较Compare(S, T)比较结果有三种:S 大于T ,S 等于T ,S 小于T 。

5.插入Insert(S, pos, T)若0≤pos ≤Length(S),则在串S 的第pos 个字符之前插入串T ,串S 的新长度为Length(S)+Length(T)。

串
若 S[pos]=T[1], S[pos+1] ≠ T[2]

Sm

SS[0]
1) 判断 S[i] = T[j] 是否成立? 成立:
i 和 j同时向后移动一个位置,
若 j<=T[0]
否则
则继续执行步骤 1);
返回本轮比较的开始位置,算法结束;
不成立: 从本轮比较开始位置的下一字符开始再重新和模式的字符
算法 4.1
4.2 串的表示和实现
(1)顺序存储结构
(2)链式存储结构
(a) 定长顺序存储表示
——————串的定长顺序存储表示————— —
#define MAXSTRLEN 255 typedef unsigned char SString[MAXSTRLEN+1] ;
// 0号单元存放串的长度
i=pos
S
S1
S2

T
Spos Spos+1
T1 T2


Sm
TT[0]
Sm+1

SS[0]
i=pos+1
S
S1
S2

Spos Spos+1
T T1

T2
Sm

Sm+1
TT[0]

SS[0]
i=pos+2 S S1 S2 … Spos Spos+1 T … T1 Sm T2 Sm+1 … … TT[0] SS[0]
则表明S中从pos位置开始无与T匹配的子串,函数返回0。
4.3 串的模式匹配算法
二、算法思想
以定长顺序存储结构为例,算法的中心思想为:
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、串和基本概念 串(String)是零个或多个字符组成的有限序列。 一般记作:S=“a1a2a3…an” 其中S是串名,双引号括起来的字符序列是串值; ai(1≦i≦n)可以是字母、数字或其它字符;串中所包 含的字符个数称为该串的长度。长度为零的串称为空 串(Empty String),它不包含任何字符。 2018年11月26
日 8
第四章 串
4.2 串的存储结构
4.2.1 串的定长顺序存储 类似于顺序表,用一组地址连续的存储单元存储串值 中的字符序列,所谓定长是指按预定义的大小,为每 一个串变量分配一个固定长度的存储区,如:
1. 类似顺序表,用一个指针来指向最后一个字 符,这样表示的串描述如下: typedef struct { char data[MAXSIZE]; int curlen; } SeqString;
2018年11月26 日
9
第四章 串
s.data
0 S
1 t
2 u
3 d
4 e
5 n
s.curlen … MAXSIZE-1
2.在串尾存储一个不会在串中出现的特殊字符作为串的 终结符,以此表示串的结尾。比如C语言中处理定长串 的方法就是这样的,它是用'\0'来表示串的结束。 3. 设定长串存储空间:char s[MAXSIZE+1]; 用s[0] 存放串的实际长度,串值存放在s[1]~s[MAXSIZE],字 符的序号和存储位置一致,应用更为方便。的串称为空白串 (Blank String) 。
注意:空串和空白串的不同。 二、串的术语 1.主串和子串:串中任意个连续字符组成的子序列称 为该串的子串,包含子串的串相应地称为主串。通常 将子串在主串中首次出现时的该子串的首字符对应的 主串中的序号,定义为子串在主串中的序号(或位 置)。例如,设A和B分别为 A=“This is a string” B=“is” 则B是A的子串,A为主串。
4.求子串SubStr (s,i,len): 操作条件:串s存在,1≤i≤StrLength(s), 0≤len≤StrLength(s)-i+1。 操作结果:返回从串s的第i个字符开始的长度为 len 的子串。len=0得到的是空串。
2018年11月26 日
6
第四章 串
5.串比较 StrCmp(s1,s2) 操作条件:串s1,s2存在。操作结果:若s1= =s2,操 作返回值为0;若s1<s2, 返回值<0;若s1>s2, 返回 值>0。
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的串值改变。 2018年11月26
2018年11月26 日
5
第四章 串
3.连接操作 :StrConcat (s1,s2,s) 或StrConcat (s1,s2)
操作条件:串s1,s2存在。
操作结果:两个串的联接就是将一个串的串值紧接 着放在另一个串的后面,连接成一个串。前者是产生 新串s,s1和s2不改变; 后者是在 s1的后面联接 s2的串 值,s1改变, s2不改变。
6.子串定位 StrIndex(s,t):找子串t在主串s中首 次出现的位置 操作条件:串 s,t存在。操作结果:若t∈s,则操作 返回t在s中首次出现的位置,否则返回值为-1。
2018年11月26 日
7
第四章 串
7.插入 StrInsert(s,i,t) 操作条件:串s,t存在,1≤i≤StrLength(s)+1。 操作结果:将串t插入到串s 的第i个字符位置上。
第四章 串
4.1 串的定义及基本运算
4.2 串的存储结构
4.3 模式匹配算法的实现 4.4 小结与习题
2018年11月26 日
1
第四章 串
串(字符串)是一种特殊的线性表,它的数据元 素仅由一个字符组成,计算机非数值处理的对象经常 是字符串数据,在事物处理程序中,一般也是作为字 符串处理的。 4.1 串的定义及基本运算
2018年11月26 日
10
第四章 串
4.2.2
定长顺序串的基本运算
1.串联接:把两个串s1和s2首尾连接成一个新串s 。 int StrConcat1(s1,s2,s) { int i=0 , j, len1, len2; len1= StrLength(s1); len2= StrLength(s2) if (len1+ len2>MAXSIZE-1) return 0 ; j=0; while(s1[j]!=’\0’) { s[i]=s1[j];i++; j++; } j=0; while(s2[j]!=’\0’) { s[i]=s2[j];i++; j++; } s[i]=’\0’; return 1; }
2018年11月26 日
3
第四章 串
2.子串的位置:子串的第一个字符在主串中的序号称 为子串的位置。 B在A中出现了两次,首次出现所对 应的主串位置是3。因此,称B在A中的序号(或位置) 为3。 特别地,空串是任意串的子串,任意串是其自身的 子串。 3.串相等:称两个串是相等的,是指两个串的长度 相等且对应字符都相等。
2018年11月26 日
4
第四章 串
三、串的基本运算 1.求串长StrLength(s): 操作条件:串s存在;操作结果:求出串s的长度。 2.串赋值StrAssign(s1,s2) 操作条件: s1是一个串变量,s2或者是一个串常量, 或者是一个串变量(通常s2 是一个串常量时称为串赋 值,是一个串变量称为串拷贝)。 操作结果:将s2的串值赋值给s1, s1原来的值被覆 盖掉。
2018年11月26 日
11
第四章 串
2. 求子串 int StrSub (char *t, char *s, int i, int len) { 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’; d e n t.data 例2. s.curlen return 1;}
相关文档
最新文档