数据结构-串
2016-09-04 11:34
162 查看
定义
串(string)是由零个或多个字符组成的有限序列,又名叫字符串。串一般记为。用双引号或单引号括起来的字符序列是串的值(引号不属于串的内容)。所谓的序列,说明串的相邻字符之间具有前驱和后继的关系。
几种特殊的串
空串(nullstring):零个字符的串,它的长度为零,可以直接用两双引号“""”表示,也可以用希腊字母“Φ”来表示。
空格串:只包含空格的串。
子串与主串:串中任意个数的连续字符组成的子序列称为该串的子串,相应地,包含子串的串称为主串。子串在主串中的位置就是子串的第一个字符在主串中的序号。
串比较
串的比较是通过组成串的字符之间的编码来进行的,而字符的编码指的是字符在对应字符集中的序号。目前计算机常用的编码方式为标准的ASCII编码,由7位二进制数表示一个字符,总共可以表示128个字符。后来发现一些特殊符号的出现,128个不够用,于是扩展ASCII码由8位二进制数表示一个字符,总共可以表示256个字符,这已经足够满足以英语为主的语言和特殊符号进行输入、存储、输出等操作的字符需要了。
全世界有成百上千种语言与文字,显然这256个字符是不够的,因此后来就有了Unicode编码,比较常用的是由16位的二进制数表示一个字符,这样总共就可以表示个字符,约是6.5万多个字符,足够表示世界上所有语言的所有字符了。为了和ASCII码兼容,Unicode的前256个字符与ASCII码完全相同。
存储结构
顺序存储
链式存储
顺序存储
类似于线性表的顺序存储,用一组地址连续的存储单元存储字符串的字符序列。在系统编译时按照顺序存储预定义的大小分配一个固定长度的存储区。串的实际长度在预定义长度内,超过预定义长度就会被截断。进行串操作时也会自动截断。
堆分配存储
因为顺序存储需要预先指定存储空间的大小,在实际操作中不能拓展空间。如果开始分配的空间较大,会造成空间浪费;如果分配过小,会导致字符串出错。为了解决这个问题,出现了堆分配存储的方式。
堆分配存储仍然是采用连续的地址空间存放字符串,但是这种地址空间是在程序执行过程中动态分配的。
在C语言中,有一个“堆”的自由存储区,并由malloc()和free()分配和释放空间。
因为堆分配存储方式具有顺序存储的特点,又对串长没有限制,可以任意增大减小使用空间,使用非常灵活,所以堆分配的方式咋应用程序中经常被采用。
链式存储
串的链式存储结构,与线性表是相似的,但由于串结构的特殊性,结构中的每个元素数据是一个字。这种串结构就是链串。串的链式存储结构除了在连接串与串操作时有一定方便之外,因为存储量大和操作复杂,总的来说不如顺序存储灵活,性能也不如顺序存储结构好。
块链串
如果也简单的应用链表存储串值,一个结点对应一个字符,就会存在很大的空间浪费。因此,一个结点可以存放一个字符,也可以考虑存放多个字符,最后一个结点若是未被占满时,可以用“#”或其他非串值字符补全:
这样的话,一个结点存多少个字符才合适就变得很重要,这会直接影响着串处理的效率,需要根据实际情况做出选择。
相关文章推荐
- 数据结构基本概念
- 数据结构 06 栈 实现
- 数据结构八种排序方法作业示例(无讲解)
- 数据结构_1:线性表: Vector
- 哈希表---直接进行访问的数据结构
- 【算法和数据结构】_14_小算法_Blank字符替换
- 复习三:链表——数据结构的前奏之建立链表
- 常用数据结构--线性结构
- 数据结构 22 哈希 实现
- NDK开发(四):JNI数据结构之JNINativeMethod
- 第<2>章 实现复杂的数据结构
- 共同学习Java源代码--数据结构--LinkedList类(五)
- 迷宫问题的通用解法C语言数据结构实现
- Redis内部数据结构详解(5)——quicklist
- 基本数据结构的实现——单向链表
- 数据结构 - 图
- 涂鸦数据结构0 关于博客组织和知识体系构建的思考
- 学数据结构,是不是一定要先学离散数学
- 【数据结构】算法4.6-4.7 KMP算法
- BZOJ 1895 & POJ 3580 supermemo [SPLAY]【数据结构】