数据结构篇——串(String)

一、引入


        在计算机中的处理的数据内容大致可分为以整形、浮点型等的数值处理和字符、字符串等的非数值处理。

        今天我们主要学习的就是字符串数据。本章主要围绕“串的定义、串的类型、串的结构及其运算”来进行串介绍与学习。

二、串的定义


2.1、串的基本定义


        串(string)是由零个或多个字符组成的有限序列,也是一种内容受限的线性表。其特殊性体现在数据元素是一个字符。一般表示为:

S="abcdefg";

        其中,S是串的名,双引号内元素的个数为串的长度,0个元素的串被称为空串,其长度为0;

Tips:字符串中的“空格”也算是串的一个元素,当一个串的元素只有空格时,这个串称为“空格串”

2.2、子串以及串相等的条件


        在一个串中,任意几个连续字符所组成的序列称之为该串的子串,包含子串的串叫做主串。子串在主串中的位置通常用子串的第一个字符在主串中的位置表示。

        例如下图的四个串:

 

        它们的长度分别为3、4、7、8.且a、吧、都是c和d的子串。其中a在c、d中的位置都是1.而b在c中的位置为4,在d中的位置为5。

        那么,怎么判断两个串是否相等呢?一般来说,只有当两个串的长度相等且各个位置对应的字符都相等时才相等。像上图中的a、b、c、d彼此都不相等。

三、串的类型定义和储存结构


3.1、串的类型定义与基本操作


        串的逻辑结构与先信标相似,但其基本操作的对象却有较大的区别。串的操作主要集中在“子串”这样的一个部分整体而不是单个元素。

其常见的基本操作如下:

函数初始条件操作结果
StrAssign(&T,chars)chars是字符串常量生成一个其值等于chars的串T
StrCopy(&T,S)串S存在由串S复制得到串T
StrEmpty(S)串S存在判断串S是否为空串
StrCompare(S,T)串S、T存在比较S、T的大小。分别返回>0、=1、<0的值
StrLength串S存在返回串S的长度(元素个数)
ClearString串S存在将S清为空串
Concat(&T,s1,s2)串s1、s2存在将s1、s2拼接并由T返回
SubString(&Sub,S,pos,len)串S存在,1<=pos<=StrLength(S)且0<=len<=StrLength(S)-pos+1用sub返回串S的第pos个字符起长度为len的子串
Index(S,T,pos)串S、T存在,T非空串,1<=pos<=StrLength(S).若S、T中有相同的子串,则返回它在主串S中的第pos个字符后第一次出现的位置,否则返回0
Replace(&s,T,V)串S、T存在,T非空串用V替换主串S中出现的所有与T相等的不重叠子串
StrInsert(&S,pos,T)串S、T存在,1<=pos<=StrLength(S)+1.在串S的第pos个字符前插入串T
StrDelete(&S,pos,len)串S存在,1<=pos<=StrLength(S)-len+1从S中删除第pos个字符起长度为len的子串
DestoryString(&S)串S存在销毁串S

3.2、串的储存结构 


        同其他数据结构一样,串也是有着最为常见的两种储存结构——顺序和链式。但考虑到存储效率和算法方便性,串多采用链式存储。

3.2.1、顺序存储


1、定长顺序存储:

        类似于线性表,用一组地址连续的存储单元存储串值的字符序列,按照预定义的大小,为每个串变量分配一个固定长度的存储区。则可用定长数组如下表示:

#define MAXLEN 255    //定义串的最大长度
typedef struct{char ch[MAXLEN+1];    //存储串的一维数组int length;            //记录串的长度
} SSting;

        但这种存储方式如同它的名字一样,是存储长度是固定的。串的实际长度只能小于等于MAXLEN,超过预定义长度的串值会被舍去,称为截断。串长有两种表示方法: 一是如上述定义描述的那样,用一个额外的变量len来存放串的长度;二是在串值后面加一一个不计入串长的结束标记字符“\0”,此时的串长为隐含值。

        但是现实生活中所遇到的数据长度都是不固定的。这时候内存的动态分布就显得格外重要。这时候就印出了一个新的顺序存储结构——堆分配存储。

2、堆分配存储:

        在c语言中存在一个称之为堆(Heap)的自由存储区,可以为每个新产生的串动态分配一块实际串长所需要的存储空间,若分配成功,则返回指向起始地址的指针作为串的基址,同时为了方便处理,约定串长也作为存储结构的一部分。定义如下:

typedef struct{char *ch;    //若是非空串,则按串长分配存储区,否则ch为NULLint length;
}HString;

 3.2.2、链式存储


        在顺序串中,我们发现,如果对其进行插入或者删除操作就显得十分麻烦。而链表结构在这方面就刚好能弥补这个弊端。但由于串的特殊性——结构中的每一个数据元素是一个字符,所以存在一个问题——每个结点中可以只存放一个字符,也可以存放多个字符。如图所示

 

        所以,当结点大小大于1时,由于串长不一定是结点大小的整数倍,所以链表中最后一个结点不一定全被串值占满。此时通常补上“#”或其他非串值字符。

        为了操作方便,当以链表存储串值的时候,除头指针外,还可附设一个尾指针指示链表中的最后一个结点,并给出当前串的长度。说明如下:

#define CHUNKSIZE 80        //定义块大小//定义结点结构
typedef struct Chunk{char ch[CHUNKSIZE];struct Chunk *next;
}Chunk;typedef struct{Chunk *head,*tail;    //串的头尾指针int length;        //串的长度
}LString

        串值的链式存储结构对某些串操作有一定的方便之处,但总体来说,不如顺序结构灵活。它占用存储量大且操作复杂。

四、小结 


        本文主要介绍了串的定义及其存储结构。涉及到的串的匹配算法相对比较重要,所以将单独发布来学习。

        如果我的内容对你有帮助,在下就厚着脸皮讨个点赞关注。如果你有更好的想法,还望留在评论区让我来参考学习。我将不胜感激并努力创作出更好的内容。         

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/30371.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32F4 UDP组播通信:填一填ST官方HAL库的坑

先说写作本文的原因&#xff0c;由于开项目开发中需要用到UDP组播接收的功能&#xff0c;但是ST官方没有提供合适的参考&#xff0c;使用STM32CubeMX生成的代码也是不能直接使用的&#xff0c;而我在网上找了一大圈&#xff0c;也没有一个能够直接解决的方案&#xff0c;deepse…

考研数一非数竞赛复习之Stolz定理求解数列极限

在非数类大学生数学竞赛中&#xff0c;Stolz定理作为一种强大的工具&#xff0c;经常被用来解决和式数列极限的问题&#xff0c;也被誉为离散版的’洛必达’方法&#xff0c;它提供了一种简洁而有效的方法&#xff0c;使得原本复杂繁琐的极限计算过程变得直观明了。本文&#x…

MWC 2025 | 紫光展锐与中国联通联合发布5G eSIM 平板

2025 年 3 月 3 日至 6 日&#xff0c;在全球移动通信行业的年度盛会 —— 世界移动通信大会&#xff08;MWC 2025&#xff09;上&#xff0c;紫光展锐联合中国联通重磅发布了支持eSIM的5G平板VN300E。 该产品采用紫光展锐T9100高性能5G SoC芯片平台&#xff0c;内置8 TOPS算力…

MySQL进阶-关联查询优化

采用左外连接 下面开始 EXPLAIN 分析 EXPLAIN SELECT SQL_NO_CACHE * FROM type LEFT JOIN book ON type.card book.card; 结论&#xff1a;type 有All ,代表着全表扫描&#xff0c;效率较差 添加索引优化 ALTER TABLE book ADD INDEX Y ( card); #【被驱动表】&#xff0…

大模型gpt结合drawio绘制流程图

draw下载地址 根据不同操作系统选择不同的安装 截图给gpt 并让他生成drawio格式的&#xff0c;选上推理 在本地将生成的内容保存为xml格式 使用drawio打开 保存的xml文件 只能说效果一般。

2025-03-08 学习记录--C/C++-C 语言 判断一个数是否是完全平方数

C 语言 判断一个数是否是完全平方数 使用 sqrt 函数计算平方根&#xff0c;然后判断平方根的整数部分是否与原数相等。 #include <stdio.h> #include <math.h>int isPerfectSquare(int num) {if (num < 0) {return 0; // 负数不是完全平方数}int sqrtNum (int)…

Java高频面试之集合-07

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;ArrayList 和 Vector 的区别是什么&#xff1f; ArrayList 与 Vector 的区别详解 ArrayList 和 Vector 都是 Java 中基于…

《原型链的故事:JavaScript 对象模型的秘密》

原型链&#xff08;Prototype Chain&#xff09; 是 JavaScript 中实现继承的核心机制。每个对象都有一个内部属性 [[Prototype]]&#xff08;可以通过 __proto__ 访问&#xff09;&#xff0c;指向其原型对象。每个对象都有一个原型&#xff0c; 原型本身也是一个对象&#xf…

第11章 web应用程序安全(网络安全防御实战--蓝军武器库)

网络安全防御实战--蓝军武器库是2020年出版的&#xff0c;已经过去3年时间了&#xff0c;最近利用闲暇时间&#xff0c;抓紧吸收&#xff0c;总的来说&#xff0c;第11章开始学习利用web应用程序安全&#xff0c;主要讲信息收集、dns以及burpsuite&#xff0c;现在的资产测绘也…

【redis】全局命令set、get、keys

生产环境 未来在工作中会涉及到的几个环境&#xff1a; 办公环境&#xff08;入职后&#xff0c;公司给你发个电脑&#xff09;开发环境 有的时候&#xff0c;开发环境和办公环境是一个&#xff08;一般做前端和做客户端&#xff09;有的时候&#xff0c;开发环境是一个单独的…

Paper Reading | AI 数据库融合经典论文回顾

人工智能&#xff08;AI&#xff09;和数据库&#xff08;DB&#xff09;在过去的50年里得到了广泛的研究&#xff0c;随着数据库近年来的不断发展&#xff0c;数据库开始与人工智能结合&#xff0c;数据库和人工智能&#xff08;AI&#xff09;可以相互促进。一方面&#xff0…

Linux上位机开发(开篇)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 传统的上位机开发&#xff0c;一般都是默认pc软件开发。既然是pc软件&#xff0c;一般来说都是基于windows平台开发。开放的框架&#xff0c;无非是…

最长递增子序列--蓝桥oj3046拍照

题目链接 arr[] 1700 1701 1702 1703 1704 1705 dp1[] 1 2 3 4 5 6 dp2[] 6 5 4 3 2 1 sum[]dp1[]dp2[] sum[] 7 7 7 7 7 7 7是最大的倒叙和正序的…

upload-labs文件上传

第一关 上传一个1.jpg的文件&#xff0c;在里面写好一句webshell 保留一个数据包&#xff0c;将其中截获的1.jpg改为1.php后重新发送 可以看到&#xff0c;已经成功上传 第二关 写一个webshell如图&#xff0c;为2.php 第二关在过滤tpye的属性&#xff0c;在上传2.php后使用b…

LeetCode1137 第N个泰波那契数

泰波那契数列求解&#xff1a;从递归到迭代的优化之路 在算法的世界里&#xff0c;数列问题常常是我们锻炼思维、提升编程能力的重要途径。今天&#xff0c;让我们一同深入探讨泰波那契数列这一有趣的话题。 泰波那契数列的定义 泰波那契序列 Tn 有着独特的定义方式&#xf…

OpenCV 拆分、合并图像通道方法及复现

视频讲解 OpenCV 拆分、合并图像通道方法及复现 环境准备&#xff1a;安装 OpenCV 库&#xff08;pip install opencv-python&#xff09; 内容&#xff1a; 1. 读取任意图片&#xff08;支持 jpg/png 等格式&#xff09; 2. 使用 split () 函数拆解成 3 个单色通道&#xf…

【ArcGIS】地理坐标系

文章目录 一、坐标系理论体系深度解析1.1 地球形态的数学表达演进史1.1.1 地球曲率的认知变化1.1.2 参考椭球体参数对比表 1.2 地理坐标系的三维密码1.2.1 经纬度的本质1.2.2 大地基准面&#xff08;Datum&#xff09;的奥秘 1.3 投影坐标系&#xff1a;平面世界的诞生1.3.1 投…

登录固定账号和密码:

接口文档 【apifox】面试宝典 个人中心-保存用户数据信息 - 教学练测项目-面试宝典-鸿蒙 登录固定账号和密码&#xff1a; 账号&#xff1a;hmheima 密码&#xff1a;Hmheima%123 UI设计稿 【腾讯 CoDesign】面试宝典 CoDesign - 腾讯自研设计协作平台 访问密码&#xff1…

软件测试的基础入门(二)

文章目录 一、软件&#xff08;开发&#xff09;的生命周期什么是生命周期软件&#xff08;开发&#xff09;的生命周期需求分析计划设计编码测试运行维护 二、常见的开发模型瀑布模型流程优点缺点适应的场景 螺旋模型流程优点缺点适应的场景 增量模型和迭代模型流程适应的场景…

大模型架构记录2

一 应用场景 1.1 prompt 示例 1.2 自己搭建一个UI界面&#xff0c;调用接口 可以选用不同的模型&#xff0c;需要对应的API KEY 二 Agent 使用 2.1 构建GPT