考研数据结构之串的基础知识

提示:君子藏器于身,待时而动

文章目录

  • 前言
  • 考纲要求
  • 一、关于C中字符串
  • 二、数据结构中的String
    • 2.1 基本概念:
    • 2.2 串的存储结构
      • 1. 定长顺序存储表示
      • 2.变长分配存储表示(堆分配)
      • 3.块存储
    • 2.3基操(考研依然最好按照这些名字来写)
    • 2.4 字符集编码
  • 三、下一篇链接(动态顺序串)
  • 总结


前言

在我没学习数据结构之前的感觉中 串就是一个封装了多个函数 ,这里这个数据结构中的串 就是写c++中串是如何实现的 前面有一篇博文已经写过关于串中函数使用

考纲要求

掌握字符串模式匹配,重点掌握KMP匹配算法的原理以及next数组推算过程,手动计算next数组可以先算出匹配值染回再进行变形,或根据公式来求解,了解nextval数组的求解方法

一、关于C中字符串

提示:串个人认为是计算机数据结构中最重要的一种形式,尽管可能并不是考的最多的或者最难的
所以在此我们来详细叙述一下
1、C++中是存在string类型的 但是C语言中不存在字符串类型 ,你可能也知道C中是使用字符数组来存储字符串的 ,C字符串实质上就是一个以‘\0’ 字符结尾的字符数组 若不是以’\0’则就是一个普通的字符串, 那么请看下面两个 但是下面哪种是字符串的赋值?

char Str[]="sun";//可以使用等号初始化
char Array[]={'s','u','n'};//字符数组的赋值

sizeof(Str)=4
sizeof(Array)=3
printf("%s",Str)=sun
Printf("%s",Array)=sun?/*有时正确打印 有时会发生转码错误,至于什么时候正确什么时候不正确 这个主要看运气 ,
要是运气好 n后面就是一个'\0' 则就停止了 所以使用这种方式打印是不对的 若想让完全没有问题Array[]={'s','u','n','\0'}*/
 char *s1Arr=Str; //s1Arr="sun"
 char *s1Arr="sun";
 /*通过上面这两句就应该发现一个事实 "sun"==Str  数组的值和数组中第一个元素的地址(或指向该元素的指针)是相同的string Str="sun"; cout<    
/* char *a="abcd";
    //a[1]='a';
    puts(a);
    printf("此时字符串是%s",a);
    return 0;
     虽然可以打印,但是不能对其中值进行修改
*/
 char s1Arr[]=sArr[4];//数组之间不能直接赋值

对打印结果的解析:sizeof 求的是实际申请的空间量 因为“ ”双引号中编译器知道是一个字符串 编制时会在数组之后加上一个’\0’ 所以若是想知道可以使用strlen(str)
2、string对象和C字符串之间的转换
可以将C字符串存储在string类型的变量中 我想原因可能是C字符串中是有结束符的 而C++中是可以解析到’\0’ 所以可以直接赋值,例如:
char a[] = “sun”;
string b;
b=a;
但string对象不能自动的转换为C字符串, 可能原因是 存储a的本来是一个字符数组 空间是定下来的,若是b 的长度小于a 则a 剩余空间需要全部添加为’\0’ 需要进行显式的类型转换,需要用到string类的成员函数c_str().
例如:
strcpy(a,b.c_str());
**
3、当传入参数为字符数组时
因为一个数组的长度可以是任意的。当数组名用作函数的参数时,函数无法通过数组名本身知道数组的大小,因此必须引入某种规则。对字符串来说,这种规则就是字符串的最后一个字符是ASCII字符NUL(’\0’) 要不然也会像前面写的一样直到遇到第一个’\0’才会停止 不要跟我说你传入一个string 型变量 他们的本质都是一个地址 遇到’\0’结束

二、数据结构中的String

2.1 基本概念:

  1. 串是由零个或者多个字符组成的有限序列
  2. 串中任意个连续字符
    组成的子序列称为该串的字串 包含字串的串相应的称为主串
  3. 字串在主串中的位置以第一个字符在主串中的位置来表示
  4. 当两个串的长度相等且每一个元素对应的字符都相等时 称这两个串是相等的
  5. 由一个或者多个空格(空格是特殊的字符)组成的串称为空格串 其长度为空格的数目

2.2 串的存储结构

1. 定长顺序存储表示

1.1类似于线性表的顺序存储结构 用一组地址连续的存储单元存储串值的字符序列
1.2截断:串的实际长度只能小于或者等于MAXLEN 超过预计长度的串值会被舍去

考研数据结构之串的基础知识_第1张图片

考研数据结构之串的基础知识_第2张图片
考研数据结构之串的基础知识_第3张图片

1.3 串的表示 :1用一个额外的变量存放串的长度 2.串值后面加一个不计串长的标记字符“\0” 此时的串长为隐含值
1.4 串值超过序列的长度的上界 约定用截断法处理 解决方法:使用动态顺序表

考研数据结构之串的基础知识_第4张图片

2.变长分配存储表示(堆分配)

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

考研数据结构之串的基础知识_第5张图片

3.块存储

块存储有的同学肯会把他想成单链表存储 不过把其中变量值替换成字符型 ,但是其实不是的,因为若是若是按照下图例中例题一中的存储方式 数据存储的密度只能达到50% 左右,所以有的人想到了每一个结点我让它多存储一些数据 这样数据密度就提上来了
就如下面的例二一样,每一个结点可以存放一个字符 也可以存放多个字符 每个结点称为块 整个链表称为块链结构
实质上就是:就是将一串字符串分割拆开储存在链表里面,每个节点中可以存储多个单字节。这是普通的链表每个节点存储一个字符

考研数据结构之串的基础知识_第6张图片
块的存储密度:串值所占存储位/实际分配的存位

2.3基操(考研依然最好按照这些名字来写)

StrAssign(&T,chars) 赋值操作。把串T赋值为chars
StrCopy(&T,S) 复制操作。由串S复制得到串T
StrEmpty(S) 判空操作。若S为空串,则返回true
StrCompare(S,T) 比较操作。若S>T,则返回值>0;若S=T,则返回值=0;若S StrLength(S) 求串长。返回串S的元素个数
SubString(&Sub,S,pos,len) 求子串。用Sub返回串S的第pos个字符起长度为len的子串
Concat(&T,S1,S2) 串联接。用T返回由S1和S2联接的新串
Index(S,T) 定位操作。若主串S中存在与串T值相同的子串,则返回它在主串S中第一次出现的位置,否则函数值为0
ClearString(&S) 清空操作。将S清为空串
DestroyString(&S) 销毁串。将串S销毁(回收存储空间)

2.4 字符集编码

英文字符——ASCII码字符集
中英文——Unicode字符集

三、下一篇链接(动态顺序串)

因为函数较多 写在一个篇章中加上解析什么的有点臃肿 还是放在下一篇(动态顺序串)吧
重点内容在[模式匹配 也就是所谓的KMP]

总结

若是文章对你的提升由哪怕一点帮助的话 请答应我 不要吝啬你的点赞评论 你的鼓励对作者是一种莫大的鼓励转载请告知哪一部分我检查一下

你可能感兴趣的:(#,串,数据结构)