字符串(简称串)是一种特殊的线性表,对于计算机来说,处理的非数值对象就是字符串,在最初的时候,字符串一般是作为输入或输出的直接量出现的,并不对它进行直接操作,慢慢随着计算机的发展,串也成为了一个变量参与了运算。
串的基本概念
- 串是零个或多个字符组成的有限序列,一般记作:
- S = "a1a2a3...an";
- 空串和空白串
- 长度为零的串被称为空串,不含有任何字符
- 仅有一个或多个空格组成的字符串称为空白串
- 子串和主串
- 子串可以说是主串的子序列
- 子串的位置:子串的第一个字符在主串中的序号称为子串的位置
- 串变量和串常量
- 顾名思义串变量跟变量是一样的,而常量是不可改变的量
串的基本运算
其实在很多高级语言里面均提供了相应的运算符或标准的库函数来实现下面就描述下C语言的< string.h >库中的一些常用的库函数(自己尝试实现的)
//求串长
int strlen(char *s)
{
//思路是找到字符串的结尾‘\0’就是他的长度了
//但其实源码的方法更高效
int length = 0
while (*s++)
length++;
return length;
}
//串复制
char *strcpy(char *dest,const char * source)
{
char *r = dest;
//检查指针是否有效
assert((dest!=NULL) && (source!=NULL));
//实行串复制
while(*dest!='\0' && *source!='\0')
*dest++ = *source++;
return r;
}
//串联接
char *strcat(char *dest,const char *source)
{
char *r = dest;
//检查指针是否有效
assert((dest!=NULL) && (source!=NULL));
//将指针移到目标字符串的结尾处
while(*dest)
*dest++;
//进行拼接操作
while(*source)
*dest++ = *source++;
return r;
}
//字符串大小比较
//即两个字符串自左向右逐个(按ANSCII码大小进行比较)
//直到遇见零或‘\0’时比较结束
int strcmp(const char *str1,const char *str2)
{
//str1 = str2 返回零
//str1 < str2 返回一个小于零的数
//str1 > str1 返回一个大于零的数
while(*str1 == *str2)
{
if(*str1 == '\0')
return 0;
str1++;
str2++;
}
return *str1-*str2;
}
串的存储结构
因为串也是一种特殊的线性表,所以就有串的存储结构也有顺序存储结构和链式存储结构
串的顺序存储
串的顺序存储简称顺序串,与顺序表类似,是用一组连续的存储单元来存储串中的字符序列,所以一般就是用字符数组来实现,但是对于不同存储分配方式来说,可以分为
- 静态存储分配的顺序串
- 动态存储分配的顺序串
定义描述:
静态存储分配的顺序串:
//直接使用定长的数组来进行描述
#define MAXSIZE 200
char s[200]//可容纳199个字符的顺序串
//类似于顺序表的定义
typedef struct
{
char s[MAXSIZE];
int length;
}SeqString;
动态存储分配的顺序串:
动态存储分配的顺序串一般来说不用考虑串长,用malloc()和free()来分配和释放空间
//简单的定义
char *s;
//类似顺序表的定义
typedef struct
{
char *s;
int length;
}SeqString;
串的链式存储结构
用单链表的方式存储串值被称为链串
链串与单链表的相比较而言,链串结点的数据域可以选择是存储单字符还是多个字符,通常结点大,存储密度就高,但带来的是处理效率的降低,而结点小,存储密度就低,但是处理效率会高很多,虽然串的链式存储结构对于某些串运算(像连接运算或插入运算有一定的方便之处),但是还是不如顺序串灵活