串操作算法虛擬實現

//串:它是有限字符集中的零個或多個字符組成的有限序列
//一種特殊的線性表

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爲止

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章