数据结构——串

在处理非数值问题时,串经常被用到。串是一种线性结构,与线性表不同的是:

串的操作特点是:一次操作若干个数据元素,而线性表一次操作一个数据元素;

串的数据类型:线性表的数据类型是任意类型,而串数据元素类型只允许为字符类型;

串的存储结构方式:顺序存储结构和链式存储结构;

串的动态数组存储结构时间和空间效率都更高

模式匹配是串最重要和最复杂的操作,Brute-Force算法和KMP算法是串最重要的模式匹配算法

1.串的定义和功能要求

1.比较串的大小

S1=“Data” S2=“DataStructure” S3=“Data Structure”
S4=“DataStructurs” S5=”data structure”

由于字符串的大小比较应该用ASCII来比较,并且小写大于大写,字母越后越大!还有注意空格

2.串与字符是两个不同概念

  • 串是长度不确定的字符序列,而字符只是一个字符。即使长度为1的串和字符也是不同的。例如:串”a”和字符’a’,就是两个不同的概念。“a”表示为:

    字符’a’仅有前面的字母。

3.C语言中的串函数:(在string.h文件中)

若已有如下定义:

char s1[]=”I am a student”;
char s2[20]=”teacher”;
char s3[]=”student”;
int result;
char s4[20],*p;

  • 串长度

printf(“%d”,strlen(s1));………………………….. //输出14

  • 复制

strcoy(s4,s2); ……………………. //将s2中的元素复制给s4
printf(“%s\n”,s4);………………..//输出teacher

  • 比较

int result=strcmp(s2,s3);……………………//比较s2,s3大小
printf(“%d\n”,result); ……………………..//输出1

  • 字符定位

p=strchr(s1,’s’);………………………//p为char类型的指针,让p指向在s1中字符’s’的位置
printf(“%s\n”,p);……………………..//输出为student

  • 连接

strcat(s2,s3);………………………..//
printf(“%s\n”,s2);……………….//输出为teacherstudent

2.穿的存储结构

1.串的顺序存储结构

(1)静态数组存储
用静态内存分配方法定义的数组,数组的长度是确定的,在运行时不能更改,因此称为:定长数组结构

typedef struct
{
    char str[MaxSize];
    int length;
}String;

其中,MaxSize表示数组元素的个数,str表示存储串值得数组名,length表示当前长度,必须有length < MaxSize

(2).动态数组存储
动态数组结构中数组元素的个数是在用户申请动态数组空间时才确定的

typedef struct
{
    char *str;
    int maxLength;
    int length;
}DString;

str是动态数组的数组名,str指向动态数组的首地址,maxLength表示动态数组字符的最大个数,length表示串的当前长度,必须满足length< maxLength

2.串的链式存储结构

(1).单字符结点链
单字符节点链就是每个结点的数据域只包含一个字符,结构体定义为:

typedef struct node
{
    char sstr;
    struct Node *next;
}SCharNode;

每个字符域str所占的存储空间为1个字节,但是这种方法空间利用率非常低

(2).块链
块链就是每个结点的数据域包含若干个字符。其结构为:

typedef struct Node
{
    char str[Number];
    struct Node *next;
}NCharNode;

3串的匹配模式(关于Brute-Force算法,KMP算法 略)

你可能感兴趣的:(数据结构)