串操作算法虚拟实现

//串:它是有限字符集中的零个或多个字符组成的有限序列
//一种特殊的线性表

int indexz(String S,String T,int pos)
{
	//T为非空串,若主串S中第pos个字符之后存在与T相等
	//的子串,则返回第一个这样的子串在S中的位置
	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;//如果找到相同的,就返回主串中的位置
		}
	}
	return 0;
}

//1.定义串的定长

#define MAXSTRLEN 255//用户可在255内定义最大串长
Typedef unsigned char Sstring[MAXSTRLEN+1];//0号单元存放串的长度

//2.串链接:用T返回由S1和S2链接而成的新串,若未截断,返回TRUE

Status Concat(SString &T,SString S1,SString S2)
{
	if(S1[0]+S2[0]<=MAXSTRLEN)//如果两个串长度之和小于新串T的长度
	{
		T[1...S1[0]=S1[1..S1[0]];//S1[0]表示最后一个元素,把S1中所有元素赋到T中
		T[S1[0]+1..S1[0]+S2[0]]=S2[1...S2[0]];//把S2中元素赋到S1元素+1后面,正好链接
		T[0]=S1[0]+S2[0];//最后T串长度就是两个串长度之和
		uncut=TRUE;//没有被截断
	}

	else if(S1[0]<MAXSTRSIZE)
		//第二种情况,S1长度小于T,但S1+S2大于T,这样,S1完全插入,而S2没有完全
	{
		T[1..S1[0]=S1[1...S1[0]];//把S1中的元素都赋到T中
		T[S1[0]+1...MAXSTRLEN]=S2[1..MAXSTRLEN-S1[0]];//把S2中部分元素链接到S1后面
		T[0]=MAXSTRLEN;//T的长度等于开始T的分配 长度
		uncut=FALSE;//串被截断
	}

	else
		//第三种情况,串T等于串S1的长度。
	{
		T[0...MAXSTRLEN]=S1[0...MAXSTRLEN];//把S1所有元素赋到T中
		uncut=FALSE;//被截断
	}
	return uncut;
}

//3.求子串的函数
//用Sub返回串S的第POS个字符起长度为Len的子串
//1<=pos<=StrLength(s)且0<=len<=StrLength(S)-pos+1

Status SubString(Sstring &Sub,SString S,int pos,int len)
{
	if(pos<1||pos>S[0]||len<0||len>S[0]-pos+1)//如果pos不合法或者长度溢出,
		return ERROR;//返回错误
	Sub[1..len]=S[pos..pos+len-1];//把符合情况的子串赋给新串
	Sub[0]=len;//Sub[0]用来存放数组的长度
	return OK;
}

//4。子串匹配算法。:返回子串T在主串S中第POS个字符之后的位置,
//若不存在,返回0
{
	i=pos;//i为主串的移动指针
	j=1;//J为在子串上移动的指针
	while(i<=S[0]&&j<=T[0])//如果两个指针都小于各自的最大长度
	{
		if(S[i]==T[j])//如果比较时候相等
		{
			i++;//让主串指针移动到下一个位置
			j++;//子串指针也移动到下一位置
		}
		else
		{
			i=i-j+2;//回溯,就是让主串指针回到最后比较的下一位,最为比较起点
			j=1;//让子串让从头开始与主串比较
		}
	}
	if(j>T[0])//当子串指针移动到最后仍然相等,那就返回其位置,说明找到
		return i-T[0];
	else
		return 0;
}

//5.串置换:将串"S"中所有子串"T"的出现都换成"v"
//在S中定位t,然后根据t和v二者的长度;
t.curlen<v.curlen:后移动v.curlen-t.curlen
t.curlen=v.curlen:替换
t.curlen>v.curlen:前移动t.curlen-v.curlen
//重复,直到s中不存在t为止

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值