串的类型定义、存储结构及其运算

串的类型定义、存储结构及其运算

串的定义——内容受限的线性表

  • 串(string)——零个或多个任意字符组成的有限序列
    在这里插入图片描述
  • 子串:一个串中任意个连续字符组成的子序列(含空串)称为该串的子串。
    例如,“abcd”的子串有:""、“a”、“ab”、“abc”、“abcd”、“bc”等
  • 真子串:是指不包含自身的所有子串。
  • 主串:包含子串的串相应地称为主串
  • 字串位置:字符在序列中的序号为该字符在串中的位置。
  • 子串位置子串第一个字符在主串中的位置。
  • 空格串:由一个或多个空格组成的串,与空串不同
  • 串相等:当且仅当两个串的长度相等并且各个对应位置上的字符都相同时,这两个串才是相等的。
  • 所有空串是相等的。

串的抽象类型定义

  • ADT String{
    数据对象:D={ ai | ai ∈ CharacterSet,i=1,2,…,n,n≥0}
    数据关系:R1={ < a(i-1),ai > | a(i-1),ai ∈ D,i=2,…,n }
    基本操作
    • StrAssign(&T,chars)    
      // 生成一个其值等于chars的串T(chars是字符串常量)
      StrCopy(&T,S)    
      // 由串S复制得T
      StrEmpty(S)    
      // 若S为空串,返回true,否则返回false
      StrCompare(S,T)    
      // 若S>T,则返回值>0;若S=T,则返回值=0;若S<T,则返回值<0
      StrLength(S)    
      // 返回S的元素个数,称为串的长度
      ClearString(&S)    
      // 将S清为空串
      Concat(&T,S1,S2)    
      // 用T返回由S1和S2联接而成的新串
      SubString(&Sub,S,pos,len)    
      // 用Sub返回串S的第pos个字符起长度为len的子串
      Index(S,T,pos)    
      // 若主串S中存在和串T值相同的子串,则返回它在主串S中第pos个字符之后第一次出现的位置;否则函数值为0
      Replace(&S,T,V)    
      // 用V替换主串S中出现的所有与T相等的不重叠的子串
      StrInsert(&S,pos,T)    
      // 在串S的第pos个字符之前插入串T
      StrDelete(&S,pos,len)    
      // 从串S中删除第pos个字符起长度为len的子串
      DestroyString(&S)    
      // 销毁串S
      }ADT String

串的存储结构

  • 串中元素逻辑关系与线性表的相同,串可以采用与线性表相同的存储结构。
    在这里插入图片描述

串的顺序存储

  • 串的定长顺序存储结构,可以简单地理解为采用 “固定长度的顺序存储结构” 来存储字符串,因此限定了其底层实现只能使用静态数组。使用定长顺序存储结构存储字符串时,需结合目标字符串的长度,预先申请足够大的内存空间。
//------串的定长顺序存储结构-------
#define MAXLEN 255       //串的最大长度
typedef struct{
    char ch[MAXLEN+1];   //存储串的一维数组
    int length;          //串的当前长度
}SString; 

串的链式存储

  • 串的块链存储,指的是使用链表结构存储字符串。
    在这里插入图片描述
    优点:操作方便
    缺点:存储密度较低
    在这里插入图片描述
    为克服缺点,可以将多个字符存放在一个结点里
    在这里插入图片描述
//-------串的链式存储结构---------
#define CHUNKSIZE 80       //可由用户定义的块大小
typedef struct Chunk{
     char ch[CHUNKSIZE];
     struct Chunk*next;
}Chunk;
typedef struct{
     Chunk *head,*tail;    //串的头和尾指针
     int length;           //串的当前长度
}LString;                  //字符串的块链结构

声明:此博客只是作者为了熟悉知识点而写的笔记
借鉴:《数据结构》(C语言版)(第2版)严蔚敏

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
栈和队列是两种常见的线性数据结构,它们都可以用于数据的存储和操作。 栈(Stack)是一种先进后出(LIFO,Last In First Out)的数据结构。栈的定义是一个有序的元素集合,可以通过栈顶的位置进行访问和操作。栈的基本操作包括入栈(push)和出栈(pop)。入栈操作将一个元素放入栈顶,出栈操作将栈顶元素移除并返回。除此之外,还有获取栈顶元素(peek)和判断栈是否为空(isEmpty)的操作。 队列(Queue)是一种先进先出(FIFO,First In First Out)的数据结构。队列的定义是一个有序的元素集合,可以通过队首和队尾的位置进行访问和操作。队列的基本操作包括入队(enqueue)和出队(dequeue)。入队操作将一个元素放入队尾,出队操作将队首元素移除并返回。除此之外,还有获取队首元素(peek)和判断队列是否为空(isEmpty)的操作。 栈和队列的顺序存储结构可以使用数组来实现。对于栈而言,可以使用数组的一端作为栈顶,并通过指针或索引记录栈顶位置。对于队列而言,可以使用数组的两端作为队首和队尾,并通过指针或索引记录队首和队尾位置。 栈的基本运算包括: - 入栈(push):将元素放入栈顶; - 出栈(pop):将栈顶元素移除并返回; - 获取栈顶元素(peek):返回栈顶元素但不移除; - 判断栈是否为空(isEmpty):判断栈中是否没有元素。 队列的基本运算包括: - 入队(enqueue):将元素放入队尾; - 出队(dequeue):将队首元素移除并返回; - 获取队首元素(peek):返回队首元素但不移除; - 判断队列是否为空(isEmpty):判断队列中是否没有元素。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值