数据结构--5.串

5.串

本章的目的是介绍串的逻辑结构、存储结构及其串上的基本运算。本章重点是掌握串的基本概念和三种表示方法。

考核要求:

识记:串的定义

掌握:串的定长顺序实现

5.1串的定义

串(string)是由零个或多个字符组成的有限序列,又名叫字符串

一般记为s=“a1a2…an”,其中s是串的名字,用引号括起来的字符序列是串的值。

零个字符的串称为空串

空格串,是只包含空格的串。注意它与空串的区别,空格甲是有内容有长度的,而且可以不止一个空格。
子串与主串,串中任意个数的连续字符组成的子序列称为该串的子串,相应地,包含子串的串称为主串。
子串在主串中的位置就是子串的第一个字符在主串中的序号。

5.2串的比较

串的比较是通过组成串的字符之间的编码来进行的,而字符的编码指的是字符在对应字符集中的序号。

给定两个串:s=“a1a2……an”,t=“b1b2……bm”,当满足以下条件之一时,s<t。
1.n<m,且ai=bi(i=1,2,……,n)。
例如当s=“hap”,t=“happy”,就有s<t。因为t比s多出了两个字母。

2.存在某个k<=min(m,n),使得ai=bi(i=1,2,……,k-1),ak<bk。

例如当s=“happen”,t=“happy”,因为两串的前4个字母均相同,而两串第5个字母(k值),字母e的ASCII码是101,而字母y的ASCII码是121,显然e<y,所以s<t。

5.3串的抽象数据类型

对于串的基本操作与线性表是有很大差别的。线性表更关注的是单个元素的操作,比如查找一个元素,插入或删除一个元素,但串中更多的是查找子串位置、得到指定位置子串、替换子串等操作。

ADT串(string)
Data
	串中元素仅由一个字符组成,相邻元素具有前驱和后继关系。
Operation
	StrAssign(T,*chars):生成一个其值等于宇符串常量chars的串T。
	strCopy(T,s):串s存在,由串s复制得串T。
	clearstring(s):串s存在,将串清空。
	StringEmpty(s):若串s为空,返回true,否则返回false
	strLength(s):返回串s的元素个数,即串的长度。
	strCompare(s,T):若s>T,返回值>0,若S=T,返回0,若S<T,返回值<0
	Concat(T,s1,s2):用T返回由s1和s2联接而成的新串。
	SubString(Sub,S,pos,len):串s存在,1≤pos≤strLength(s),0≤len≤strLength(s)-pos+1,用Sub返
						回串s的第pos个字符起长度为len的子串
	Index(s,T,pos):串s和T存在,T是非空串,1≤pos≤StrLength(s)。
				若主串s中存在和串T值相同的子串,则返回它在主串s中
				第pos个字符之后第一次出现的位置,否则返回0Replace(s,T,v):串S、T和V存在,T是非空串。用V替换主串s中出现的所有
			与T相等的不重叠的子串。
	StrInsert(s,pos,T):串s和T存在,1≤pos≤strLength(s)+1。
				在串s的第pos个字符之前插入事T。
	StrDelete(s,pos,len):串s存在,1≤pos≤strLength(s)-len+1。
				从串s中删除第pos个字符起长度为len的子事。
endADT

Index的实现算法

/*T为非空串。若主串S中第pos个字符之后存在与T相等的子。
/*则返回第一个这样的子串在s中的位置,否则返回0*/
int Index(string s, string T, int pos)
{
    int n,m,i;
    String sub;
    if(pos>0)
    {
        n=StrLength(s);//得到主串s的长度
        m=StrLength(T);//得到子串T的长度
        i=pos;
        while(i<=n-m+1)
        {
            SubString(sub,s,i,m);//取主串第i个位置
            					//长度与T相等子串给sub
            if(StrCompare(sub,T)!=0)//如果两串不相等
                ++i;
            else	//如果两串相等
                return i;//则返回i值
        }
    }
    return  0//若无子串与t相等,返回0
}

5.4串的存储结构

顺序存储结构

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

链式存储结构

在这里插入图片描述

5.5朴素的模式匹配算法

子串的定位操作通常称为串的模式匹配

在这里插入图片描述
在这里插入图片描述

/*返回子串T在主串s中第pos个字符之后的位置。若不存在,则函数返回值为0。*
/*T非空,1≤pos≤StrLength(s)。*/
int Index(string s, string T, int pos)
{
    int i=pos;//i用于主串s中当前位置下标,若pos不为1则从pos位置开始匹配
	int j=1:/*j用于子串T中当前位置下标值*/
	while(1<=S[0] && j<=T[0])/*若i小于s长度且j小于T的长度时循环*/
    {
        if(s[i]==T[j])/*两字母相等则继续*/
        {
            ++i;
			++j;
        }			
		else/*指针后退重新开始匹配*/
        {
            i=i-j+2;/*i退回到上次匹配首位的下一位*/
			j=1;//j退回到子串t的首位
        }
    }
	if(j>T[0])
   		 return i-T[0];
	else 
   		 return 0;
}

在这里插入图片描述
在这里插入图片描述

5.6KMP模式匹配算法(暂时忽略)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值