【数据结构】第四章 串

【数据结构】第四章 串

1.基本概念

字符串是一种特殊的线性表,其特殊性在于组成线性表的每个元素就是一个单字符。
串(String)是零个或多个字符组成的有限序列。
子串:串中任意个连续的字符组成的子序列称为该串的子串
主串:包含子串的串相应地称为主串。
子串在主串中的位置则以子串的第一个字符在主串中的位置来表示。
只有当两个串的长度相等,并目每个对应位置的字符都相等时才相等。
(1)定长顺序串
定长顺序串是将串设计成一种结构类型,串的存储分配是在编译时完成的。与前面所讲的线性表的顺序存储结构类似,用一组地址连续的存储单元存储串的字符序列。
(2)堆串
这种存储方法仍然以一组地址连续的存储单元存放串的字符序列,但它们的存储空间是在程序执行过程中动态分配的,而顺序串的长度是固定的。建立一个新串时,系统从空间中分配一个大小和字符串长度相同的空间存储新串的串值。
(3)块链串
由于串也是一种线性表,因此也可以采用链式存储。由于串的特殊性(每个元素只有个字符),在具体实现时,每个结点既可以存放一个字符,也可以存放多个字符。每个结点称为块,整个链表称为块链结构。

2.算法

定长顺序串

定长顺序串存储结构:

#define MAXLEN 40
typedef struct{
	char ch[MAXLEN];
	int len;
}SString;
  1. 串插入函数
    问题分析:插入位置pos将串分为两部分,可能会出现3种情况:1.len(ACB)<=MAXLEN,将B后移len©个位置,在插入C。2.len(pos+C)<=MAXLEN,则B后移时有部分字符被舍弃。3.len(pos+C)>MAXLEN,B的全部字符被舍弃,C插入时部分字符被舍弃。
StrInsert(SString *s, int pos, SString t)
{
	int i;
	if(pos<0||pos>s->len) return -1;
	if(s->len+t.len<=MAXLEN)
	{
		for(i=s->len+t.len-1;i>=pos+t.len;i--) s->ch[i]=s->ch[i-t.len];
		for(i=0;i<t.len;i++) s->ch[pos+i]=t.ch[i];
		s->len=s->len+t.len;
	}
	else if((pos+t.len<=MAXLEN)&&(s->len+t.len>MAXLEN))
	{
		for(i=MAXLEN-1;i>pos+t.len-1;i--) s->ch[i]=s->ch[i-t.len];
		for(i=0;i<t.len;i++) s->ch[pos+i]=t.ch[i];
		s->len=MAXLEN;
	}
	else{
		for(i=0;i<MAXLEN-pos;i++) s->ch[i+pos]=t.ch[i];
		s->len=MAXLEN;
	}
	return 1;
}
  1. 串删除函数
''' 在串s中删除从下标pos起len 个字符'''
StrDelete(SString *s, int pos, int len)
{
	if(pos<0||pos>(s->len-len)) return -1;
	for(int i=pos+len;i<s->len;i++)
	{
		s->ch[i-len]=s->ch[i];
	}
	s->len=s->len-len;
	return 1;
}
  1. 串比较函数
StrCompare(SString s ,SString 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]);
	}
	return (s.len-t.len);
}
  1. 定位函数(模板匹配算法)
    算法思想: 设计i ,j ,start三个指示器:
    (1)i 指向主串S中当前比较的字符,起始指向S的首字符,此后,每比较一步后移一个位置,一趟比配失败时,回溯到该趟比较起点的下一位置
    (2)j 指向子串T中当前比较字符,起始指向T的首字符,此后,每比较一步,后移一个位置,一趟匹配失败时,回溯到T的首字符处
    (3)start 记录每趟比较时在主串S中的起点,每趟比较后,后移一个位置,以便确定下一趟的起始位置。
'''求从主串s 的下标pos起,串第一次出现的位置,成功返回位置序号,不成功返回-1 '''
StrIndex(SString s, int pos, SString t)
{
	 int i, j, start;
	 if(t.len==0) return -1;
	 i=j=0;
	 start = pos;
	 while(i<s.len&&j<t.len) {
	 	if(s.ch[i]==t.ch[j]) {i++;j++;}
	 	else { start++; i=start; j=0;}
	 }
	 if(j<len) return -1;
	 else return start;
}
发布了11 篇原创文章 · 获赞 1 · 访问量 950

猜你喜欢

转载自blog.csdn.net/sinat_33438008/article/details/104240727