字符串

字符串的定义

  1. 字符串是一种最常用的非数值类型。
  2. 字符串是由零个或多个字符组成的有限序列,字符串的逻辑结构与线性表相似,只是数据对象约束为字符集合,字符串的操作中数据元素操作不像线性表那样单个元素操作,而是通常作为一个整体进行操作。

串的表现和实现

  1. 概念

    1. 串的常用定长顺序存储、堆分配存储和块链存储三种方法实现。
    2. 串相等:如果两个串的串值相等(相同),称这两个串相等。换言之,只有当两个串的长度相等,且各个对应位置的字符都相同时才相等。
  2. 定长顺序存储表示

    1. 与线性表的顺序存储结构相同,用一组连续的固定长度地址空间进行存储。超过定义范围的字符串将被

      截断舍弃。

    2. 这个空间里面保存的字符串是什么,其方法是在C语言中用一个结束符号 ’\0‘ 进行标记,在定长顺序存储方法中字符串的长度保存在数组第一个位置、0位置。

堆分配存储表示

使用堆存储数据的方式已经学过很多了,线性表在堆中分配空间时分配比较大的一块空间,之后有一个表示线性表内元素个数的变量控制线性表的操作。字符串的堆分配存储方式是按照字符串长度分配堆空间,不会额外多分配空间,如果字符串为空,堆中不分配空间。

块链存储形式

  1. 像线性表一样如果每个字符都以一个节点形式存储,这是比较浪费空间,见下图。因为字符串操作通常不以单个元素为单位进行,而通常对多个元素进行操作。
  2. 可以设计一个大块Chunk节点,在Chunk节点中存储多个字符,并将Chunk块用链表方式链接,如果最后一个大块不能完全填充存储则约定某个符号为空字符,如 ‘#’,这种存储方式成为块链存储表示。

字符串匹配算法

  1. 概念

    给定一个字符串从这个字符串中查找某个字符串是否为该串的子串的操作称为串的模式匹配算法。

  2. 朴素算法

  3. KMP 算法