数据结构篇——串(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.mzph.cn/news/897268.shtml

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

相关文章

【智能体架构:Agent】LangChain智能体类型ReAct、Self-ASK的区别

1. 什么是智能体 将大语言模型作为一个推理引擎。给定一个任务&#xff0c; 智能体自动生成完成任务所需步骤&#xff0c; 执行相应动作&#xff08;例如选择并调用工具&#xff09;&#xff0c; 直到任务完成。 2. 先定义工具&#xff1a;Tools 可以是一个函数或三方 API也…

OmniParser技术分析(一)

1.引言 通过上篇文章介绍 OmniParser:下一代纯视觉UI自动化测试先驱相信大家已经对OmniParser有初步了解&#xff0c;接下来详细介绍下OmniParser使用了哪些技术模型实现了对UI纯视觉的检测和理解。 2.整体方案 通过阅读OmniParser提供的运行Demo代码知道&#xff0c;其实整…

设计心得——继承和实例

一、继承的应用场景 在上篇文章分析了继承的应用&#xff0c;本文反过来讲继承和实例。可以理解对上文的继承进行一下基础知识的铺垫&#xff0c;继承的应用场景非常多&#xff0c;典型的应用场景包括&#xff1a; 1、单纯属性的继承 这种继承非常常见&#xff0c;在前面也举过…

从连接到交互:SDN 架构下 OpenFlow 协议的流程与报文剖析

在SDN架构中&#xff0c;交换机与控制器之间的通信基于 OpenFlow协议&#xff0c;其设计目的是实现控制平面与数据平面的解耦。以下是 交换机连接控制器 和 数据包进入交换机触发交互 的详细流程及协议报文分析&#xff1a; 一、交换机连接控制器的流程&#xff08;初始化阶段&…

opentitan riscv

OpenTitan‌是一个开源的硅根信任&#xff08;Root of Trust, RoT&#xff09;项目&#xff0c;旨在使硅RoT的设计和实现更加透明、可信和安全&#xff0c;适用于企业、平台提供商和芯片制造商。该项目由lowRISC CIC管理&#xff0c;作为一个协作项目&#xff0c;旨在生产高质量…

R语言使用scitable包交互效应深度挖掘一个陌生数据库

很多新手刚才是总是觉得自己没什么可以写的&#xff0c;自己不知道选什么题材进行分析&#xff0c;使用scitable包后这个完全不用担心&#xff0c;选题多到你只会担心你写不完&#xff0c;写得不够快。 今天演示一下使用scitable包深度挖掘一个陌生数据库 先导入R包和数据 li…

电脑内存智能监控清理,优化性能的实用软件

软件介绍 Memory cleaner是一款内存清理软件。功能很强&#xff0c;效果很不错。 Memory cleaner会在内存用量超出80%时&#xff0c;自动执行“裁剪进程工作集”“清理系统缓存”以及“用全部可能的方法清理内存”等操作&#xff0c;以此来优化电脑性能。 同时&#xff0c;我…

C#控制台应用程序学习——3.8

一、语言概述 1、平台相关性 C# 主要运行在.NET 平台上。.NET 提供了一个庞大的类库&#xff0c;C# 程序可以方便地调用这些类库来实现各种功能&#xff0c;如文件操作、数据库访问、网络通信等。 2、语法风格 C# 的语法与 C、C 和 Java 有一定的相似性。例如&#xff0c;它使用…

鸿蒙HarmonyOS-Navagation基本用法

Navagation基本用法 Navigation组件是路由导航的根视图容器&#xff0c;一般作为Page页面的根容器使用&#xff0c;其内部默认包含了标题栏&#xff0c;内容栏和公工具栏&#xff0c;其中内容区默认首页显示导航内容&#xff08;Navigation的子组件&#xff09;或非首页显示&am…

初阶数据结构(C语言实现)——4.1栈

目录 1.栈1.1栈的概念及结构1.2 栈的实现1.1.0 栈的初始化1.1.1 销毁1.1.2 入栈1.1.3 出栈1.1.4 获取栈中有效元素个数1.1.5 检测栈是否为空&#xff0c;如果为空返回非零结果&#xff0c;如果不为空返回01.1.6 获取栈顶元素1.1.7 验证 附录 栈的C语言实现源码.h文件.c文件test…

计算光学成像与光学计算概论

计算光学成像所涉及研究的内容非常广泛&#xff0c;虽然计算光学成像的研究内容是发散的&#xff0c;但目的都是一致的&#xff1a;如何让相机记录到客观实物更丰富的信息&#xff0c;延伸并扩展人眼的视觉感知。总的来说&#xff0c;计算光学成像现阶段已经取得了很多令人振奋…

什么样的物联网框架适合开展共享自助KTV唱歌项目?

现在物联网的广泛应用&#xff0c;也让更多用户们看到了它的实力&#xff0c;也使得共享经济遍地开花。其中共享自助唱歌设备也备受欢迎&#xff0c;那么适合开展共享自助KTV唱歌项目的物联网框架都应具备哪些特点呢&#xff1f; 智能化与自动化管理 物联网技术在共享KTV中的应…

机器视觉选型中,不同焦距的镜头成像视野有什么不同?

不同焦距的镜头成像视野的差异主要体现在视角范围和透视效果上。焦距越长&#xff0c;视角越窄&#xff0c;能捕捉的景物范围越小&#xff1b;焦距越短&#xff0c;视角越广&#xff0c;覆盖的景物范围越大。以下是具体分析&#xff1a; 焦距与视角的关系 焦距&#xff08;Foc…

Linux16-数据库、HTML

数据库&#xff1a; 数据存储&#xff1a; 变量、数组、链表-------------》内存 &#xff1a;程序运行结束、掉电数据丢失 文件 &#xff1a; 外存&#xff1a;程序运行结束、掉电数据不丢失 数据库&#xff1a; …

开源订货系统哪个好 三大订货系统源码推荐

在数字化转型加速的今天&#xff0c;企业对订货系统的需求日益增长。一款优质的订货系统源码不仅能提升供应链效率&#xff0c;还能通过二次开发满足个性化业务需求。这里结合 “标准化、易扩展” 两大核心要求&#xff0c;为您精选三款主流订货系统源码&#xff0c;助您快速搭…

行为模式---迭代器模式

概念 迭代器模式是设计模式的行为模式&#xff0c;它的主要设计思想是提供一个可以操作聚合对象&#xff08;容器或者复杂数据类型&#xff09;表示&#xff08;迭代器类&#xff09;。通过迭代器类去访问操作聚合对象可以隐藏内部表示&#xff0c;也可以使客户端可以统一处理…

Maven的学习以及安装配置 2024/3/1 idea

1. Maven的安装 1.1 首先查看编程工具合适的Maven版本 我使用的是2024/3/1 版本的idea&#xff0c;接下来我会用这个版本的idea进行演示。idea没有汉化的也可以参考我的步骤。 1、打开idea的设置&#xff0c;搜索Maven&#xff0c;进入Maven设置。 我们可以看到&#xff0c;…

基于 Docker 的跨平台镜像构建与增量更新实战指南

引言&#xff1a;破解容器化两大核心问题 在实际开发中&#xff0c;我们常常面临两个棘手问题&#xff1a; 跨平台兼容性&#xff1a;如何在Windows平台开发的镜像&#xff0c;无缝运行在 ARM64 服务器&#xff1f;更新效率低下&#xff1a;每次代码调整都要重新安装全部依赖…

支付通道开通对接一般需要多少钱

不少老板都想开通AIP线上接口&#xff0c;但是不知道这个成本到底是多少? 其实目前第三方支付公司对外提供了标准的线上接入技术方案&#xff0c;一般以API、SDK等形式。因此&#xff0c;商户在完成签约审核后&#xff0c;可以顺利拿到技术的密钥&#xff0c;正常调用第三方支…

什么是 spring 的循环依赖?

什么是 spring 的循环依赖&#xff1f; 首先&#xff0c;认识一下什么是循环依赖&#xff0c;举个例子&#xff1a;A 对象被 Spring 管理&#xff0c;并且引入的 B 对象&#xff0c;同样的 B 对象也被 Spring 管理&#xff0c;并且也引入的 A 对象。这种相互被引用的情况&#…