串和数组的定义和存储结构

一、串

    • 串的定义——几个术语

:内容受限的线性表,零个或多个任意字符组成的有限序列

字串:一个串中任意个连续字符组成的子序列(含空串)称为该串的子串。

真子串是指不包含自身的所有子串。

主串:包含子串的串相应地称为主串

字符位置:字符在序列中的序号为该字符在串中的位置

子串位置子串第一个字符在主串中的位置

空格串:由一个或多个空格组成的串,与空串不同

串相等:当且仅当两个串的长度相等并且各个对应位置上的字符都相同时,这两个串才是相等的。

所有空串是相等的。

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

2.1基本操作

  1. StrAssign(&T,chars) //串赋值

  1. StrCompare(S,T) //串比较

  1. StrLength(S) //求串长

  1. Concat(&T,S1,S2) //串连结

  1. SubString(&Sub,S,pos,len) //求子串

  1. StrCopy(&T,S) //串拷贝

  1. StrEmpty(S) //串判空

  1. ClearString(&S) //清空串

  1. Index(S,T,pos) //子串的位置

  1. Replace(&S,T,V) //串替换

  1. StrInsert(&S,pos,T) //子串插入

  1. StrDelete(&S,pos,len) //子串删除

  1. DestroyString(&S) //串销毁

串中元素逻辑关系和线性表的相同,串可以采用与线性表相同的存储结构。

2.2串的顺序存储结构

#define MAXLEN 255
typedef struct{
    char ch[MAXLEN+1];    //存储串的一维数组
    int length;           //串的当前长度
}SString;

2.3串的链式存储结构

优点:操作方便

缺点:存储密度较低

存储密度=串值所占的存储/实际分配的存储

可将多个字符存放在一个结点中,以克服其缺点

  • 串的链式存储结构——块链结构

#define CHUNKSIZE 80      //块的大小可由用户定义
typedef struct Chunk{
    char ch[CHUNKSIZE];
    struct Chunk *next;
}Chunk;

typedef struct{
    Chunk *head,*tail;       //串的头指针和尾指针
    int curlen;                   //串的当前长度
}LString;                   //字符串的块链结构
    • 串的模式匹配算法

3.1简述

算法目的

确定主串中所含子串模式串)第一次出现的位置(定位)

算法应用:

  • 搜索引擎、拼写检查、语言翻译、数据压缩

算法种类

  • BE算法(Brute-Force,又称古典的、经典的、朴素的、穷举的)

  • KMP算法(特点:速度快)

3.2BF算法

BF算法亦称简单匹配算法。采用穷举法的思路。

主串:正文串

子串:模式

算法思路是从S的每一个字符开始依次与T的字符进行匹配。

Index(S,T,pos)

  • 将主串的第pos个字符与模式串的第一个字符比较;

  • 若相等,继续比较后续字符;

  • 若不想等,从主串的下一个字符开始,重新与模式串的第一个字符比较。

  • 直到主串的一个连续子串字符序列与模式串相等。返回值为S中与T匹配的子序列第一个字符的序号,即匹配成功。

  • 否则,匹配失败,返回值0.

int Index_BF(SString S,SString T,int pos){
    int i=pos;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;                    //模式匹配不成功
}
  

3.3KMP算法设计思想

利用已经部分匹配的结果而加快模式串的滑动速度

且主串S的指针i不必回溯,可提速到O(n+m)

int Index_KMP(SString S,SString T,int pos){
    i=pos,j=1;
    while(i<=S.length&&j<=T.length){
        if(j==0||S.ch[i]==T.ch[j]{i++;j++; }   //主串和子串依次匹配下一个字符
        else
           j=next[j];               //*i不变,j后退*/
}
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;
    }
}
  

二、数组

    • 数组的定义——几个术语

数组:按一定格式排列起来的

具有相同类型的数据元素的集合。

一维数组:若线性表中的数据元素为非结构的简单元素,则称为一维数组。

一维数组的逻辑结构线性结构。定长的线性表。

声明格式:数据类型 变量名称【长度】;

二维数组:若一维数组中的数据元素又是一维数组结构,则称为二维数组。

二维数组的逻辑结构:非线性结构和线性结构定长的线性表。非线性结构为每一个数据元素既在一个行表中,又在一个列表中。线性结构定长的线性表为该线性表的每个数据元素也是一个定长的线性表。

声明格式: 数据类型 变量名称【行数】【列数】;

数组特点:结构固定——定义后,维数和维界不再改变。

数组的基本操作:除了结构的初始化和销毁之外,只有取元素和修改元素值的操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值