数据结构——串
串的定义
串:是由零个或多个字符组成的有限序列。一般记为
S = 'a1a2...an' (n >= 0)
空串:不包含任何字符的串称为空串
子串:串中任意个连续的字符组成的子序列称为该串的子串
空格串:由一个或多个空格组成的串称为空格串(空格串不是空串,其长度为串中空格字符的个数)
串的逻辑结构
串的逻辑结构和线性表极为相似,区别在于串的数据对象限定为字符集。在基本操作上,串和线性表有很大差别。线性表的基本操作主要以单个元素作为操作对象,如查找,插入,删除某个元素等;而串的基本操作通常以字串作为操作对象,如查找,插入,删除一个字串等
串的存储结构
结构说明
在很多教材中,串的存储形式有多种,而我这篇文章使用的是方案一
顺序存储结构(静态)
类似于线性表的顺序存储结构,用一组地址连续的存储单元存储串值的字符序列。在串的顺序存储结构中,为每个串变量分配一个固定长度的存储区,即定长数组
#define MAXSIZE 255 //预定于最大串长为255
typedef struct String {
char ch[MAXSIZE]; //每个分量存储一个字符
int length; //串的实际长度
} String;
初始操作
/**
* 初始化串
*/
void initString(String &string) {
for (int i = 0; i < MAXSIZE; ++i) {
string.ch[i] = '\0';
}
string.length = 0;
}
赋值操作
/**
* 赋值操作
*/
void strAssign(String &string, char *str) {
int i, j;
for (i = 0; i < strlen(str); ++i) {
string.ch[i] = str[i];
}
for (j = i; j < string.length; ++j) {
string.ch[i] = '\0';
}
string.length = strlen(str);
}
复制操作
/**
* 复制操作:把串 str 复制到 string
*/
void strCopy(String &string, String str) {
int i, j;
for (i = 0; i < strlen(str.ch); ++i) {
string.ch[i] = str.ch[i];
}
for (j = i; j < strlen(string.ch); ++j) {
string.ch[i] = '\0';
}
string.length = strlen(str.ch);
}
判空操作
/**
* 判空操作
*/
bool strIsEmpty(String string) {
if (string.length == 0) {
return true;
} else {
return false;
}
}
比较操作
/**
* 比较操作:首先比较同位序的字母大小,其次比较字符串的长度大小
*/
int strCompare(String string, String str) {
for (int i = 0; i < string.length && i < str.length; ++i) {
if (string.ch[i] != str.ch[i]) {
return string.ch[i] - str.ch[i];
}
}
return string.length - str.length;
}
截取操作
/**
* 截取操作:用 sub 返回串 string 的第 pos 个字符起长度为 len 的子串
*/
bool subString(String &sub, String string, int pos, int len) {
if (pos + len > string.length) {
return false;
}
for (int i = pos;