顺序串的实现C++封装

串是非常重要的,比如搜索引擎对用户输入内容的匹配等等都用到有关串的知识,下面先给出串的C语言算法说明,最后给出C++封装好的例子。

C语言算法说明

定义串的数据类型

const int MAX_N = 100;
//串的数据类型
struct SqString
{
	//数据
	char data[MAX_N];
	//串长
	int length;
};
生成串

//生成串s,cstr[]字符数组有外部传入
void StrAssign(SqString s, char cstr[]){
	int i;
	for (i = 0; cstr[i] != '\0'; i++){
		s.data[i] = cstr[i];
	}
	s.length = i;
}

复制串

//复制串,将串t赋值给串s
void StrCopy(SqString &s, SqString t){
	int i;
	//串内容按字符逐个赋值
	for (i = 0; i < t.length; i++){
		s.data[i] = t.data[i];
	}
	//复制串长
	s.length = t.length;
}

是否两个串相等

//判断两个串是否相等
bool isEqual(SqString s, SqString t){
	//长度是否相等
	if (s.length != t.length){
		return false;
	}
	//内容是否相等
	else{
		int i;
		for (i = 0; i < s.length; i++){
			//不等则返回false,结束
			if (s.data[i] != t.data[i]){
				return false;
			}
		}
		//否则相等
		return true;
	}
}
求串长度

//求串长度
int StrLength(SqString s){
	return s.length;
}

串连接

//串连接,将串s和串t连接,生成新串str,串str为局部变量
SqString Concat(SqString s, SqString t){
	SqString str;
	//新串长度
	str.length = s.length + t.length;
	int i;
	//赋值第一个串s给串str
	for (i = 0; i < s.length; i++){
		str.data[i] = s.data[i];
	}
	//赋值第二个串t给串str
	for (i = 0; i < t.length; i++){
		str.data[s.length + i] = t.data[i];
	}
	return str;
}

求子串,从位置i开始的连续j个字符,生成新串并返回,若串首地址,若参数错误则返回空串

//求子串,从第i个位置开始的j个字符
SqString SubStr(SqString s, int i, int j){
	SqString str;
	str.length = 0;
	//下标起始点与位置起始点差1,j==0时生成空串,j<=时无实际意义
	if (i <= 0 || i>s.length || j <= 0 || i + j - 1 < s.length){
		return str;
	}
	else{
		int k;
		//连续赋值生成新串
		for (k = i - 1; k < i + j - 1; k++){
			str.data[k - (i - 1)] = s.data[k];
		}
		//串长
		str.length = j;
		return str;
	}
}
插入串,生成新串并返回串首地址,若参数不正确则生成空串

//插入串,将串s2插入到串s1的第i个位置开始后的N个字符,返回新串
SqString InsertStr(SqString s1, int i, SqString s2){
	int j;
	SqString str;
	str.length = 0;
	//参数不正确时返回空串
	if (i <= 0 || i > s1.length+1){
		return str;
	}
	//s1前i个元素赋值给str
	for (j = 0; j < i - 1; j++){
		str.data[j] = s1.data[j];
	}
	//s2赋值给str
	for (j = i - 1; j < s2.length; j++){
		str.data[j] = s2.data[j];
	}
	//s1剩下的所有元素赋值给str
	for (j = s2.length + i - 1; j < s1.length; j++){
		str.data[j] = s1.data[j];
	}
	str.length = s1.length + s2.length;
	return str;
}
删除串从位置i开始的连续j个字符,并生成新串,若参数不正确则返回空串

//删除从第i位置开始的j长度的字符串,返回串,参数不正确的时候返回空串
SqString DeleteStr(SqString s, int i, int j){
	SqString str;
	str.length = 0;
	if (i <= 0 || i>s.length || j <= 0 || i + j - 1 > s.length){
		return str;
	}
	else{
		int k;
		//赋值前i-1个字符
		for (k = 0; i < i - 1; k++){
			str.data[k] = s.data[k];
		}
		//跳过中间j个子字符,赋值其后剩下的字符
		for (k = i + j - 1; k < s.length; k++){
			str.data[k-j] = s.data[k];
		}
		str.length = s.length - j;
		return str;
	}
}
串替换,若参数不正确返回空串,否则生成新串并返回串首地址

//替换一段字符串,将s中第i个位置开始后j个字符替换成串t,返回新串,参数不正确时返回空串
SqString ReplaceStr(SqString s, int i, int j, SqString t){
	//被替换的字符串长度和t串长度不一定相等
	SqString str;
	str.length = 0;
	if (i <= 0 || i > s.length || j<0 || j>s.length - i + 1){
		return str;
	}
	else{
		int k;
		//赋值前i个元素
		for (k = 0; k < i - 1; k++){
			str.data[k] = s.data[k];
		}
		//插入t串
		for (k = 0; k < t.length; k++){
			str.data[k + i - 1] = t.data[k];
		}
		//赋值s串中跳过j个字符串,剩下的串
		for (k = i+j - 1; k < s.length; k++){
			str.data[t.length + (i - 1) + (k - (i + j - 1))] = s.data[k];
		}
		str.length = s.length - j + t.length;
		return str;
	}
}

输出串

//输出串
void DisplayStr(SqString s){
	int i;
	//空串处理
	if (s.length == 0){
		cout << "Empty." << endl;
	}
	//否则输出串
	else{
		for (i = 0; i < s.length; i++){
			cout << s.data[i];
		}
		cout << endl;
	}
}

以上便是顺序串的所有操作的C语言算法说明,下面给出封装好的顺序串的C++封装例子

/*
顺序串的实现C++
*/
#include<iostream>
using namespace std;
const int MAX_N = 100;
//定义数据类型
class SqStr
{
public:
	char data[MAX_N];
	int length;
};

//串
class String
{
public:
	String(){}
	~String(){}

	//生成串
	void StrAssign(char cstr[]){
		int i;
		for (i = 0; cstr[i] != '\0'; i++){
			S.data[i] = cstr[i];
		}
		S.length = i;
	}

	//复制串
	void StrCopy(String t){
		int i;
		//串赋值
		for (i = 0; i < t.GetS()->length; i++){
			S.data[i] = t.GetS()->data[i];
		}
		//串长度赋值
		S.length = t.GetS()->length;
	}

	//是否相等
	bool StrEqual(String t){
		//长度不等
		if (S.length != t.GetS()->length){
			return false;
		}
		else{
			int i;
			for (i = 0; i < S.length; i++){
				//内容不等
				if (S.data[i] != t.GetS()->data[i]){
					return false;
				}
			}
			//否则相等
			return true;
		}
	}

	//求长度
	int STrLength(){
		return S.length;
	}

	//串连接
	SqStr Concat(String t){
		SqStr str;
		str.length = S.length + t.GetS()->length;
		int i;
		//赋值S
		for (i = 0; i < S.length; i++){
			str.data[i] = S.data[i];
		}
		//赋值t
		for (i = S.length; i < S.length + t.GetS()->length; i++){
			str.data[i] = t.GetS()->data[i - S.length];
		}
		return str;
	}

	//求子串,返回从S串的位置i开始连续j个字符,返回新串,参数不正确时返回空串
	SqStr SubStr(int i, int j){
		SqStr str;
		str.length = 0;
		//下标与位置差1 
		if (i <= 0 || i>S.length || j <= 0 || i + j - 1 > S.length){
			return str;
		}
		else{
			int k;
			for (k = i - 1; k < i + j - 1; k++){
				str.data[k-(i-1)] = S.data[k];
			}
			str.length = j;
			return str;
		}
	}

	//插入串,将s1插入到S中的位置i开始,返回新串,参数不正确时返回空串
	SqStr InsertStr(String s1, int i){
		SqStr str;
		str.length = 0;
		//i 为位置,与数组下标差1
		if (i <= 0 || i > S.length + 1){
			return str;
		}
		else{
			int j;
			//插入S前i-1个字符
			for (j = 0; j < i - 1; j++){
				str.data[j] = S.data[j];
			}
			//插入串s1
			for (j = 0; j < s1.GetS()->length; j++){
				str.data[j + i - 1] = s1.GetS()->data[j];
			}
			//插入剩下的S串
			for (j = i - 1; j < S.length; j++){
				str.data[(i - 1) + s1.GetS()->length + (j - (i - 1))] = S.data[j];
			}
			str.length = S.length + s1.GetS()->length;
			return str;
		}
	}

	//删除S串中位置i开始的连续j个字符,生成新串并返回,参数不正确时返回空串
	SqStr DeleteStr(int i, int j){
		SqStr str;
		str.length = 0;
		//j<0无意义,不删除任何字符,j==0即删除0个字符串,仍为空串
		if (i <= 0 || i > S.length || j <= 0 || i + j - 1 > S.length){
			return str;
		}
		else{
			int k;
			//赋值S前i-1个字符
			for (k = 0; k < i - 1; k++){
				str.data[k] = S.data[k];
			}
			//跳过j个字符,赋值剩下的字符
			for (k = i - 1 + j; k < S.length; k++){
				str.data[k - j] = S.data[k];
			}
			str.length = S.length - j;
			return str;
		}
	}

	//替换串,将S中的位置i开始的j个字符替换成串t,生成新串并返回,参数不正确返回空串
	SqStr ReplaceStr(int i, int j, String t){
		SqStr str;
		str.length = 0;
		//j<0没有实际意义,j==0,即将i-1后的0个字符替换
		if (i <= 0 || i > S.length || j<0 || i + j - 1>S.length){
			return str;
		}
		else{
			int k;
			//赋值S的前i-1个字符
			for (k = 0; k < i - 1; k++){
				str.data[k] = S.data[k];
			}
			//插入t串
			for (k = 0; k < t.GetS()->length; k++){
				str.data[i - 1 + k] = t.GetS()->data[k];
			}
			//S串跳过j个字符后插入剩下所有
			for (k = i - 1 + j; k < S.length; k++){
				str.data[(i - 1) + t.GetS()->length + (k - (i - 1 + j))] = S.data[k];
			}
			str.length = S.length - j + t.GetS()->length;
			return str;
		}
	}

	//输出串(不带参数)
	void DisplayStr(){
		//空串处理
		if (S.length == 0){
			cout << "Empty." << endl;
		}
		//否则输出串
		else{
			int i;
			for (i = 0; i < S.length; i++){
				cout << S.data[i];
			}
			cout << endl;
		}
	}
	//输出串(带参数)
	void DisplayStr(SqStr str){
		if (str.length == 0){
			cout << "Empty." << endl;
		}
		else{
			int i;
			for (i = 0; i < str.length; i++){
				cout << str.data[i];
			}
			cout << endl;
		}
	}
private:
	SqStr S;
	//获取串首地址
	SqStr * GetS(){
		return &S;
	}
};
int main()
{
	int n, i, locate, strlength;
	char a[MAX_N];
	//生成串
	cout << "Create String." << endl;
	cout << "Input n:";
	cin >> n;
	cout << "Input " << n << " characters." << endl;
	for (i = 0; i < n; i++){
		cin >> a[i];
	}
	a[i] = '\0';
	String str1;
	str1.StrAssign(a);
	//输出串
	cout << "Dispaly string." << endl;
	str1.DisplayStr();
	//串长度
	cout << "String Length." << endl;
	cout << str1.STrLength() << endl;
	//拷贝串
	cout << "String Copy." << endl;
	cout << "Input n:";
	cin >> n;
	cout << "Input " << n << " characters." << endl;
	for (i = 0; i < n; i++){
		cin >> a[i];
	}
	a[i] = '\0';
	String str2;
	str2.StrAssign(a);
	str1.StrCopy(str2);
	str1.DisplayStr();
	//获取子串
	cout << "Get SubStr." << endl;
	cout << "Input locate, string length:";
	cin >> locate >> strlength;
	str1.DisplayStr(str1.SubStr(locate, strlength));
	//插入串
	cout << "Insert string." << endl;
	cout << "Input n:";
	cin >> n;
	cout << "Input " << n << " characters." << endl;
	for (i = 0; i < n; i++){
		cin >> a[i];
	}
	a[i] = '\0';
	str2.StrAssign(a);
	cout << "Input locate:";
	cin >> locate;
	str1.DisplayStr(str1.InsertStr(str2, locate));
	//连接串
	cout << "Concat string." << endl;
	cout << "Input n:";
	cin >> n;
	cout << "Input " << n << " characters." << endl;
	for (i = 0; i < n; i++){
		cin >> a[i];
	}
	a[i] = '\0';
	str2.StrAssign(a);
	str1.DisplayStr(str1.Concat(str2));
	//是否相等
	cout << "Is Equal." << endl;
	if (str1.StrEqual(str2)){
		cout << "YES." << endl;
	}
	else{
		cout << "NO." << endl;
	}
	//删除串
	cout << "Delete." << endl;
	cout << "Input locate, string length:";
	cin >> locate >> strlength;
	str1.DisplayStr(str1.DeleteStr(locate,strlength));
	//替换串
	cout << "Repalce." << endl;
	cout << "Input locate, string length:";
	cin >> locate >> strlength;
	str1.DisplayStr(str1.ReplaceStr(locate, strlength, str2));
	return 0;
}










你可能感兴趣的:(数据结构,C++,顺序串)