线性表--堆串(十五)
1.串的概念
1.串的基本概念 串,也就是字符串,是由零个字符或多个字符组成的有限序列。记为S = ‘a1 a2 a3…an’(n >= 0), 其中,S是串的名字,用单引号括起来的字符序列是串的值,每一个a都可以是字母,数字或其他字符,n是串中字符的个数,称为串的长度,n = 0时的串成为空串。
需要特别指出的是,串值必须使用一对单引号括起来(C语言的串是用双引号括起来的),但引号是界限符,他不属于串,只是作为一个标志,避免和其他变量相互混淆。
子串:串中任意个连续的字符组成的子序列称为该串的子串。
主串:包含子串的串称为主串,可以理解为高中学的集合,子串是主串的子集。
子串在主串中的位置:通常将字符在串中的序号称为该字符串在串中的位置,子串在主串中的位置则以子串的第一个字符在主串中的位置来表示。
例如:串A = ‘huagoufdog2506897252’ , 串B = ‘huagou’ , 串C = ‘fdog’
A的长度是20,B是6,C是4,而B在A的位置是1,C在A的位置是7。
串相等:当且仅当两个串的值相等时,才称这两个串相等,即只有两个的数值相等,且对应位置的字符都相等。 空串和空格串的的区别是空格串由一个或者多个空格,而空串是无任何字符。
2.堆串
字符串包括串名与串值两部分,而串值采用堆串存储方法存储,串名用符号表存储。
堆串存储方法:以一组地址连续的存储单元顺序存放串中的字符,但他们的存储空间是在程序执行过程中动态分配的。系统将一个地址连续,容量很大的存储空间作为字符串的可用空间,每当建立一个新串时,系统就从这个空间中分配一个大小和字符串长度相同的空间用于存储新串的串值。
串名符号表:所有串名的存储映像像构成一个符号表。借助此结构可以在串名和串值之间建立一个对应关系,称为串名的存储映像。
3.代码实现
(1)定义堆串
typedef struct
{
char * ch;
int len;
}HString;
(2)插入函数
int StrInsert(HString * s, int pos, HString * t)
{
int i;
char * temp;
if (pos<0 || pos>s->len || s->len == 0)return 0;
temp = (char *)malloc(sizeof(s->len + t->len));
if (temp == NULL)return 0;
for (i = 0; i < pos; i++)temp[i] = s->ch[i];
for (i = 0; i < t->len; i++)temp[i + pos] = t->ch[i];
for (i = pos; i < s->len; i++)temp[i + t->len] = s->ch[i];
s->len += t->len;
free(s->ch);
s->ch = temp;
return 0;
}
(3)赋值函数
int StrAssign(HString * s, char * tval)
{
//将字符串常量tval的值赋给堆串
int len, i = 0;
if (s->ch != NULL)free(s->ch);
while (tval[i] != ' ')i++;
len = i;
if (len)
{
s->ch = (char *)malloc(sizeof(len));
if (s->ch == NULL)return 0;
for (i = 0; i < len; i++)
{
s->ch[i] = tval[i];
}
}
else
{
s->ch = NULL;
s->len = len;
}
return 0;
}
- KVM基于内核的虚拟机概念理解与客户机浅析
- 洛谷 P1972 [SDOI2009]HH的项链【莫队算法学习】
- BZOJ 2257: [Jsoi2009]瓶子和燃料【数论:裴蜀定理】
- 在 EF 5 中跟踪SQL和缓存数据
- hihoCoder #1015 : KMP算法【KMP裸题,板子】
- 对X86汇编的理解与入门
- BZOJ 2748: [HAOI2012]音量调节【二维dp,枚举】
- POJ 3264 Balanced Lineup【线段树区间查询求最大值和最小值】
- HDU 2289 Cup【高精度,二分】
- BZOJ 1083: [SCOI2005]繁忙的都市【Kruscal最小生成树裸题】
- [快学Python3]二分查找[策略优化版本]
- 微服务与SOA架构(4)
- 移动测试Appium之API手册
- BZOJ 1088: [SCOI2005]扫雷Mine【思维题,神奇的模拟+枚举】
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 光照不均匀图像分割技巧1——分块阈值
- MySQL 8.0新特性 — 不可见索引
- 【小白学PyTorch】9.tensor数据结构与存储结构
- 【Python相关】jupyter平台最强插件没有之一
- 基于 OpenCV 的图像分割
- 再见,可视化!你好,Pandas!
- 40000字 Matplotlib 实操干货,真的全!
- Python自动化(二十) | 聊聊 Python 操作PDF的几种方法(合并、拆分、水印、加密)
- C语言发展史的点点滴滴
- 我写了一个R包,简化芯片的差异分析
- 【收藏】万字解析Scipy的使用技巧!
- Python 如何使用 HttpRunner 做接口自动化测试
- Python 爬虫时,高版本 App 如何进行抓包?
- 使用 shell-operator 实现 Operator
- 我们是如何用 K8S 搞定1000个应用的测试环境