字符串

字符串

1.1 字符串及其运算

1.2 字符串的存储表示

1.3 模式匹配

1.1 字符串及其运算

⚫字符串:简称串,是特殊的线性表,其特殊性主要在于表 中的每个元素是一个字符,以及由此而要求的一些特殊操 作。

⚫ 长度:一个串中包括的字符个数。长度为零的串称为空串。

⚫ 子串:字符串s1中任意个连续的字符组成的子序列s2被称 为是s1的子串,而称s1是s2的主串。

⚫ 位置:子串在主串中的位置是以子串的第一个字符在主串 中的字符序号(下标+1)。

⚫ 相等:两个串的长度相等,并且对应位置上的字符都 相等。

⚫空格串:一个或多个空格。

⚫字典序关系:如果整个字符集上有全(线)序关系,则两 个字符串之间有如下字典序关系:

 

 

 

串的基本运算

⚫创建一个空串 string createNullStr(void)

⚫ 判断一个串是否为空串 int isNullstr(String s)

⚫ 求一个串的长度 int length(String s)

⚫ 将两个串拼接在一起构成一个新串 String concat(String s1, String s2)

⚫ 在串s中,求从串的第i个字符开始连续j个字符所构成的子串 String subStr(String s, int i, int j)

⚫ 求串S2在串S1中第一次出现的位置 int index(String s1,String s2)

 

 

顺序串

1.2 串的存储表示

struct SeqString /* 顺序串的类型 */
{
  int MAXNUM;
  int n; /* 串的长度,nMAXNUM */
  char *c;
};
typedef struct SeqString *PSeqString;

 

➢ 顺序表示举例 

串s = “abcdef”,用顺序表示方式, 假设s是struct SeqString类型的变量,那么它的元素在数 组中的存放方式如下图所示:

 

 

创建一个空串

//创建一个空串
PSeqString createNull_seq(int m){
    PSeqString pstr =(PSeqString)malloc(sizeof(SeqString));
    if (pstr!=NULL)
    {
        pstr->c=(char*)malloc(sizeof(char)*m);
        if(pstr->c){
                pstr->n=0;
                pstr->MAXNUM=m;
                return pstr;
        }
    }else
    {
        cout<<"out of space"<<endl;
    }
    return NULL;
}

求顺序表示的串的子串

PSeqString subStr_seq(PSeqString s,int i,int j){
    PSeqString s1;
    int k;
    s1=createNull_seq(j);
    if(s1==NULL)return NULL;
    if (i>0&&i<=s->n&&j>0)
    {
        if(s->n<i+j-1)j=s->n-i+1;
        for (int  k = 0; i < j; i++)
            s1->c[k]=s->[i+k-1];
        s1->n=j;        
    }
    return s1;
}

 

 

链接串

在串的链接表示中,每个结点包含两个字段:字符指针,分别 用于存放字符和指向下一个结点的指针。这样一个串就可用一个 单链表来表示,其类型定义为:

 

➢ 链接表示举例s=“abcdef”

 

 

链表各节点存储数据个数的多少可参考以下几个因素:

  1. 串的长度和存储空间的大小:若串包含数据量很大,且链表申请的存储空间有限,此时应尽可能的让各节点存储更多的数据,提高空间的利用率(每多一个节点,就要多申请一个指针域的空间);反之,如果串不是特别长,或者存储空间足够,就需要再结合其他因素综合考虑;
  2. 程序实现的功能:如果实际场景中需要对存储的串做大量的插入或删除操作,则应尽可能减少各节点存储数据的数量;反之,就需要再结合其他因素。

 

结构体

struct StrNode{
    char c;
    StrNode* next;
};
typedef StrNode *LinkString;
typedef StrNode *PStrNode;
 
创建空的节点
LinkString createNullStr_Link(){
    LinkString pst;
    pst =(LinkString)malloc(sizeof(StrNode));
    if (pst!=NULL)
        pst->next=NULL;
    else
        cou<<"out of space"<<endl;
    return pst;
}
 
求子串
LinkString subStr_link (LinkString s, int i, int j){
    LinkString s1;
    PStrNode p,q,t;
    int k;
    //创建一个空串
    s1 = createNullStr_Link();
    if(s1==NULL){
        cout<<"Out of space "<<endl;
        return NULL;
    }
    if (i<1||j<1)
        return s1;
    p=s;//p指向主串
    for ( k = 1; k <= i; k++)
    {
        if (p!=NULL)
            p=p->next;
        else
            return s1;            
    }
    if (p==NULL)
        return s1;
    t=s1;//t指向子串尾
    for (k = 1; k < j; k++)
    {
        if (p!=NULL)
        {
            q= (PStrNode)malloc(sizeof(struct StrNode));
            if (q==NULL)
            {
                cout<<"out of space "<<endl;
                return s1;
            }
            q->c=p->c;
            q->next=NULL;
            t->next=q;//在子串尾加入新节点
            t=q;//t指向子串尾
            p=p->next;
        }
        return s1;
    }
}

 

posted @ 2020-06-02 20:56  多发Paper哈  阅读(279)  评论(0编辑  收藏  举报
Live2D