数据结构与算法——串(基础)

本文介绍了数据结构中字符串的三种存储结构:定长顺序存储(静态数组)、堆分配存储(动态数组)和块链存储(链表)。详细讲解了每种结构的特点,包括动态数组的申请与释放,以及在实际操作中的注意事项。最后通过示例代码展示了堆分配存储的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上上周学习了串的部分知识,今天得空将其中的一些点整理下来。
数据结构中,字符串要单独用一种存储结构来存储,称为串存储结构。这里的串指的就是字符串。

严格意义上讲,串存储结构也是一种线性存储结构,因为字符串中的字符之间也具有"一对一"的逻辑关系。只不过,与之前所学的线性存储结构不同,串结构只用于存储字符类型的数据。
一些特殊的命名
空串:存储 0 个字符的串,例如 S = “”(双引号紧挨着);
空格串:只包含空格字符的串,例如 S = " "(双引号包含 5 个空格);
子串和主串:假设有两个串 a 和 b,如果 a 中可以找到几个连续字符组成的串与 b 完全相同,则称 a 是 b 的主串,b 是 a 的子串。例如,若 a = “shujujiegou”,b = “shuju”,由于 a 中也包含 “shuju”,因此串 a 和串 b 是主串和子串的关系;
需要注意的是,空格串和空串不同,空格串中含有字符,只是都是空格而已。另外,只有串 b 整体出现在串 a 中,才能说 b 是 a 的子串,比如 “shujiejugou” 和 “shuju” 就不是主串和子串的关系。

另外,对于具有主串和子串关系的两个串,通常会让你用算法找到子串在主串的位置。子串在主串中的位置,指的是子串首个字符在主串中的位置。

例如,串 a = “shujujiegou”,串 b = “jiegou”,通过观察,可以判断 a 和 b 是主串和子串的关系,同时子串 b 位于主串 a 中第 6 的位置,因为在串 a 中,串 b 首字符 ‘j’ 的位置是 6。
串存储结构的具体实现
存储一个字符串,数据结构包含以下 3 种具体存储结构:
(1)定长顺序存储:实际上就是用普通数组(又称静态数组)存储。
(2)堆分配存储:用动态数组存储字符串;
(3)块链存储:用链表存储字符串;
首先介绍一下串的定长顺序储存:

串的定长顺序存储结构,可以简单地理解为采用 “固定长度的顺序存储结构” 来存储字符串,因此限定了其底层实现只能使用静态数组。

使用定长顺序存储结构存储字符串时,需结合目标字符串的长度,预先申请足够大的内存空间。

#include<stdio.h>
int main()
{
   
    char str[20]="data.biancheng.net";
    printf("%s\n",str);
    return 0;
}

上面这段 C 语言代码给大家完美地展示了使用定长顺序存储结构存储字符串。
串的堆分配存储结构,其具体实现方式是采用动态数组存储字符串。
通常,编程语言会将程序占有的内存空间分成多个不同的区域,程序包含的数据会被分门别类并存储到对应的区域。拿 C 语言来说,程序会将内存分为 4 个区域,分别为堆区、栈区、数据区和代码区,其中的堆区是本节所关注的。

与其他区域不同,堆区的内存空间需要程序员手动使用 malloc 函数申请,并且在不用后要手动通过 free 函数将其释放。

C 语言中使用 malloc 函数最多的场景是给数组分配空间,这类数组称为动态数组。例如:

char * a = (char*)malloc(5*sizeof(char));

此行代码创建了一个动态数组 a,通过使用 malloc 申请了 5 个 char 类型大小的堆存储空间。

动态数组相比普通数组(静态数组)的优势是长度可变,换句话说,根据需要动态数组可额外申请更多的堆空间(使用 relloc 函数):

a = (char*)realloc(a, 10*sizeof(char)
安装Docker安装插件,可以按照以下步骤进行操作: 1. 首先,安装Docker。可以按照官方文档提供的步骤进行安装,或者使用适合您操作系统的包管理器进行安装。 2. 安装Docker Compose插件。可以使用以下方法安装: 2.1 下载指定版本的docker-compose文件: curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose 2.2 赋予docker-compose文件执行权限: chmod +x /usr/local/bin/docker-compose 2.3 验证安装是否成功: docker-compose --version 3. 在安装插件之前,可以测试端口是否已被占用,以避免编排过程中出错。可以使用以下命令安装netstat并查看端口号是否被占用: yum -y install net-tools netstat -npl | grep 3306 现在,您已经安装Docker安装Docker Compose插件,可以继续进行其他操作,例如上传docker-compose.yml文件到服务器,并在服务器上安装MySQL容器。可以参考Docker的官方文档或其他资源来了解如何使用DockerDocker Compose进行容器的安装和配置。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Docker安装docker-compose插件](https://blog.youkuaiyun.com/qq_50661854/article/details/124453329)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [Docker安装MySQL docker安装mysql 完整详细教程](https://blog.youkuaiyun.com/qq_40739917/article/details/130891879)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值