《数据结构》—— 串的概述、结构以及基础操作

    • 一、串的基本概述
    • 二、串的存储结构
      • 1.1 定长顺序存储结构
      • 1.2 堆顺序存储结构
      • 1.3 快链的存储结构
    • 三、串的基本操作

一、串的基本概述

  • 串是由零个或多个字符组成的有限序列;
  • 串中任意个连续的字符组成的子序列称为该串的子串,包含子串的串相应地称为主串;
  • 子串在主串中的位置以子串的第一个字符在主串中的位置来表示;
  • 当两个串的长度相等且每个对应位置的字符都相等时,称这两个串是相等的;
  • 由一个或多个空格(空格是特殊字符)组成的串称为空格串,其长度为串中空格字符的个数。

二、串的存储结构

存储结构:顺序存储与链式存储。考虑到存储效率和算法的方便性,串多采用顺序存储结构。

类似于线性表的顺序存储结构,用一组地址连续的存储单元存储串值的字符序列。在串的定长顺序存储结构中,为每个串变量分配一个固定长度的存储区,即定长数组。


1.1 定长顺序存储结构

#define MaxLen 255      //预定义最大串长为255
typedef struct{
     
    char ch[MaxLen];   //每个分盘存储一个字符
    int length;         //串的实际长度
}SString;

串的实际长度只能小于等于MAXLEN,超过预定义长度的串值会被舍去,称为截断。

串长有两种表示方法: 1、用一个额外的变量len来存放串的长度;2、串值后面加一个不计入串长的结束标记字符“\0”,此时的串长为隐含值。

在一些串的操作(如插入、联接等)中,若串值序列的长度超过上界MAXLEN,约定用“截断”法处理,要克服这种弊端,只能不限定串长的最大长度,即采用动态分配的方式(堆式存储)。


1.2 堆顺序存储结构

堆分配存储表示仍然以一组地址连续的存储单元存放串值的字符序列,但它们的存储空间是在程序执行过程中动态分配得到的。

// 堆的顺序存储结构
typedef struct{
     
    char *ch;     //按串长分配存储区,ch指向串的基地址
    int length;   //串的长度
} HString;

在C语言中,存在一一个称之为“堆”的自由存储区,并用malloc ()和free ()函数来完成动态存储管理。利用malloc ()为每个新产生的串分配一块实际串长所需的存储空间,若分配成功,则返回一个指向起始地址的指针,作为串的基地址,这个串由ch指针来指示;若分配失敗,则返回NULL,已分配的空间可用free()释放掉。


1.3 快链的存储结构

每个结点既可以存放一个字符也可以存放多个字符。每个结点称为块,整个链表称为块链结构。
《数据结构》—— 串的概述、结构以及基础操作_第1张图片

typedef struct StringNode{
     
    char ch;        // 结点存储1个字符
    char ch[4];     // 结点存储4个字符
    struct StringNode *next;
}StringNode, *String;

三、串的基本操作

StrAssign(&T,chars):赋值操作。把串T赋值为chars。
StrCopy(&T,S):复制操作。由串S复制得到串T。
StrEmpty(S):判空操作。若S为空串,则返回TRUE,否则返回FALSE。
StrLength(S):求串长。返回串S的元素个数。
ClearString(&S):清空操作。将S清为空串。
DestroyString(&S):销毁串。将串S销毁(回收存储空间)。
Concat(&T,S1,S2):串联接。用T返回由S1和S2联接而成的新串。

例如求子串,用Sub返回串S的第pos个字符起长度为len的子串。

#define MaxLen 255      //预定义最大串长为255
// 定义串的存储结构
typedef struct{
     
    char ch[MaxLen];   //每个分盘存储一个字符
    int length;         //串的实际长度
}SString;

// 求子串
bool SubString(SString &Sub, SString S, int pos, int len){
     
    if(pos+len-1>S.length)	//长度越界
        return false;
    for(int i=pos; i<pos+len; i++)
        Sub.ch[i-pos+1] = S.ch[i]; //第pos个为第一个字符开始算起
    Sub.length = len;	//长度为len
    return true;
}

比较操作。若S>T,则返回值>0;若S=T,则返回值=0;若S

int StrCompare(SString S,SString T){
     
    for(int i=1;i<S.length && i<T.length; i++){
     
        if(S.ch[i] != T.ch[i])
            return S.ch[i]-T.ch[i];
    }
    // 扫描过的所有字符都相同,则长度长的串更大
    return S.length-T.length; 
}

Index(S,T):定位操作。若主串S中存在与串T值相同的子串,则返回它在主串S中第一次出现的位置;否则函数值为0。

int Index(SString S, SString T){
     
    int i=1, n=StrLength(S), m=StrLength(T);
    SString sub;
    while(i<n-m+1){
     
        SubString(sub,S,i,m);
        if(StrCompare(sub,T)!=0)
            ++i;
        else
            return i;   //返回子串在主串中的位置
    }
    return 0;  // S中不存在与T相等的子串
}

你可能感兴趣的:(数据结构(考研),数据结构)