zoukankan      html  css  js  c++  java
  • 【数据结构(C语言版)系列四】 串

    串类型的定义

    串(或字符串)是由零个或多个字符组成的有限序列,一般记为 s = 'a1a2...an',s为串名。子串在主串中的位置以子串的第一个字符在主串中的位置来表示。

    串和表示和实现——定长顺序存储表示

    串的顺序存储方式即是在一个字符数组中存放各字符,注意此存储方式并不包含空字符,存储字串的数组的0号单元用来标识字串长度。其存储结构如下图:

    //-----串的定长顺序存储表示-----//
    #define MAXSTREN 255    //用户可在255以内定义最大串长
    typedef unsigned char SString[MAXSTREN +1];   //0号单元存放串的长度

    堆串

    在顺序串中,如果操作中出现串值序列长度超过上界MAXSTRLEN时,约定用截尾法处理,这种情况可能在求联接等中出现。对此,只有不限定串长的最大长度,即动态分配串值的存储空间。

    堆串的本质还是顺序存储,只不过内存是动态分配的。由动态分配函数malloc()和free()来管理。利用malloc()为每个新产生的串分配一块实际串长所需的存储空间,若分配成功,则返回一个指向起始地址的指针,作为串的基址,约定串长也作为存储结构的一部分。

    堆串是个结构体,char指针指向动态分配的内存来存储字符,length用来存储串的长度。也正是因为需要使用malloc动态分配串的空间,所分配的内存均位于“堆”上,所以这种存储结构被称为“堆串”。

    堆串存储结构如下图:

    //-----串的堆分配存储表示-----//
    typedef struct{
        char *ch;
        int length;
    }HString;

    块链串

    块链串的本质依然是顺序存储,每个字串用数组接纳,各内存块用指针顺序链接。

    块链串的重点在于“块”和“链”。块链串用链表的思维存储字串,但每个结点并不是存储一个字符,还是存储多个字符,不用的“块”之间用指针相“链”。

    块链串存储结构如下图:

    串的模式匹配算法(KMP)

    首先要搞懂最长前缀和最长后缀的概念。"前缀"指除了最后一个字符以外,一个字符串的全部头部组合;"后缀"指除了第一个字符以外,一个字符串的全部尾部组合。

    参考《字符串匹配的KMP算法

     

    算法讲解参考《KMP算法最浅显理解——一看就明白

  • 相关阅读:
    multimap-swap
    multimap-size
    multimap-rend
    CentOS的利手:“Screen”一个可以在多个进程之间多路复用一个物理终端的窗口管理器
    对TCP/IP网络协议的深入浅出归纳
    程序员的数学:汉诺塔递归与非递归求解
    多柱汉诺塔问题探究
    汉诺塔问题的递归实现(扩展)
    CentOS---网络配置详解
    VMWare虚拟机下CentOS 配置网络实现远程连接,提供Web访问
  • 原文地址:https://www.cnblogs.com/wwf828/p/9547153.html
Copyright © 2011-2022 走看看