数据结构C(6)——串、数组和广义表的定义、串的类型定义、存储结构及其运算、数组、广义表

一、串的定义

  • 串:内容受限的线性表
  • 串:(String):零个或多个任意字符组成的有限序列
  • 子串:一个串中任意个连续字符组成的子序列(含空串)称为该串的子串
  • 真子串:指不包含自身的所有子串
  • 主串:包含子串的串相应的称为主串
  • 字符位置:字符在序列中的序号为该字符在传中的位置
  • 子串位置:子串第一个字符在主串中的位置
  • 空格串:由一个或多个空格组成的串,与空串不同
  • 串相等:当且仅当两个串的长度相等并且各个对应位置上的字符都相同时,这两个串才是相等的

​ 所有空串都相等

二、串的类型定义、存储结构及其运算

1、类型定义
StrAssign(&T,chars)    	//串赋值
StrCompare(S,T)        	//串比较
StrLength(S)			//求串长
Concat(&T,S1,S2)		//串连结
SubString(&Sub,S,pos,len)//求子串
StrCopy(&T,S)			//串拷贝
StrEmpty(S)				//串判空
ClearString(&S)			//清空串
Index(S,T,pos)			//子串的位置
Replace(&S,T,V)			//串替换
StrInsert(&S,pos,T)		//子串插入
StrDelete(&S,pos,len)	//子串删除
DestroyString(&S)		//串销毁
2、串的顺序存储结构
#define MAXLEN 255
typedef struct
{
    char ch[MAXLEN+1];
    int length;
}SString;
3、串的链式存储结构
  • 优点:操作方便
  • 缺点:存储密度较低
  • 存储密度=串值所占的存储/实际分配的存储
  • 可将多个字符存放在一个结点中,以克服其缺点
  • 串的链式存储结构——块链结构
#define CHUNKSIZE 80
typedef struct Chunk
{
    char ch[CHUNKSIZE];
    struct Chunk *next;
}Chunk;

typedef struct
{
    Chunk *head,*tail;	//串的头指针和尾指针
    int curlen;			//串的当前长度
}LString;
4、串的模式匹配算法
  • 目的:确定主串中所含子串(模式串)第一次出现的位置(定位)
  • 应用:搜索引擎、拼写检查、语言翻译、数据压缩
  • 种类:
    • BF算法(Brute-Force,又称古典的、经典的、朴素的、穷举的)
    • KMP算法(特点:速度快)

BF算法描述

int Index_BF(SString S,SString T)
{
    int i=1,j=1;
    while(i<=S.length&&j<=T.length)
    {
        if(s.ch[i]==t.ch[j])
        {
            ++i;++j;
        }
        else
        {
            i=i-j+2;j=1;
        }
    }
    if(j>=T.length)
        return i-T.length;
    else
        return 0;
}

KMP算法描述

int Index_KMP(SString S,SString T)
{
    int i=1,j=1;
    while(i<S.length&&j<T.length)
    {
        if(j==0||s.ch[i]==t.ch[j])
        {
            ++i;++j;
        }
        else
        {
            j=next[i];
        }
    }
    if(j>T.length)
        return i-T.length;
    else
        return 0;
}
void get_next(SString T,int &next[])
{
    i=1;next[1]=0;j=0;
    while(i<T.length)
    {
        if(j==0||T.ch[i]==T.ch[j])
        {
            ++i;++j;
            next[i]=j;
        }
        else
            j=next[j];
    }
}

三、数组

1、基本概念
  • 数组:按一定格式排列起来的具有相同类型的数据元素的集合
  • 一维数组:若线性表中的数据元素为非结构的简单元素,则称为一维数组
  • 一维数组的逻辑结构:线性结构。定长的线性表
  • 声明格式:数据类型 变量名称【长度】
  • 二维数组:若一维数组中的数据元素又是一维数组结构,则称为二维数组
  • 二维数组的逻辑结构:
    • 非线性结构:每一个数据元素既在一个行表中,又在一个列表中
    • 线性结构,定长的线性表:该线性表的每个数据元素也是一个定长的线性表
  • 声明格式:数据类型 变量名称【行数】【列数】
  • 数组特点:结构固定——定义后,维数和维界不再改变
  • 数组基本操作:除了结构的初始化和销毁之外,只有取元素和修改元素值的操作
2、数组的抽象数据类型定义
InitArray(&A,n,bound1,...,boundn)	//构造数组A
DestroyArray(&A)					//销毁数组A
Value(A,&e,index1,...,indexn)		//取数组元素值
Assign(A,&e,index1,...,indexn)		//给数组元素赋值
3、特殊矩阵的压缩存储
  • 什么是压缩矩阵?:若多个数据元素的值都相同,则只分配一个元素值的存储空间,且零元素不占存储空间
  • 什么样的矩阵可以压缩?:对称矩阵,对角矩阵,三角矩阵,稀疏矩阵等
  • 什么叫稀疏矩阵?:矩阵中非零元素的个数较少(一般小于5%)
    数据结构C(6)——串、数组和广义表的定义、串的类型定义、存储结构及其运算、数组、广义表_第1张图片数据结构C(6)——串、数组和广义表的定义、串的类型定义、存储结构及其运算、数组、广义表_第2张图片

四、广义表

  • 广义表一般用大写字母表示,小写字母表示原子

  • 表头:若广义表非空,则其第一个元素a1就是表头

    注:表头可以是原子,也可以是子表

  • 表尾:除表头之外的其他元素组成的表

    注:表尾不是最后一个元素,而是一个子表

  • 广义表性质:

    • 广义表中的数据元素有相对次序:一个直接前驱和一个直接后继
    • 广义表的长度定义为最外层所包含元素的个数
    • 广义表的深度定义为该广义表展开后所含括号的重数
    • 广义表可以为其他广义表共享
    • 广义表可以是一个递归表
    • 广义表是多层次结构,广义表的元素可以是单元素,也可以是子表,而子表的元素还可以是子表

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