• 字符串


    字符串

    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;
        }
    }

     

    因上求缘,果上努力~~~~ 作者:每天卷学习,转载请注明原文链接:https://www.cnblogs.com/BlairGrowing/p/13033671.html

  • 相关阅读:
    Linux配置YUM源(2020最新最详细)
    Linux系统安装Tomcat9(2020最新最详细)
    Linux系统安装JDK1.8(2020最新最详细)
    框架集项目-登录账户过期,如何回到登录主页!
    C# 以管理员方式运行程序
    C#/STM32 WAV转byte WAV数据格式
    C# base64 转 byte[]
    C# 截取屏幕图像
    emWin 学习笔记 —— 用VS2017打开emWin仿真包
    STM32 时钟配置的坑
  • 原文地址:https://www.cnblogs.com/BlairGrowing/p/13033671.html
Copyright © 2020-2023  润新知