数据结构篇其六-串
数据结构—串
前置说明
由于学习Java面向对象语言走火入魔,试图在C语言中模拟实现面向对象设计。里面加入了大量的函数指针配合结构体来模拟类中的成员方法
故此篇,亦可称:
面向对象的C语言程序设计
用C语言实现串这种数据结构,并将它应用到解决实际问题。
C语言特性的,麻烦的,不如自动回收的要手动管理内存,容易出Bug的。(bushi。
编程语言:C语言
IDE:VS Code
函数实现灵感:出于Java中的String类提供的方法,在C语言实现一下。
串介绍
由于版本更替,计算机对字符处理越来越多,引入了字符串的概念。
串:由零或多个字符组成的有限序列,又称字符串
一般记为s=“a1a2……an”,s为串的名称,用双引号引起来,部分语言由单引号,三引号的写法。
串的长度串的可见字符数目个数就是串的长度,就是上面的a1,a2……,an。
空串空串的长度为0,空串用"“表示。
主串与字串最初的串为主串,在主串中取一部分连续的字符序列得到一个新串,该串称为字符串的子串。比如"String"其字串可以是"S”,“Str”,""等。
串的比较两个串的比较是比较相应位置的字符,在ASCII码集中每个字符都与整数建立了一一映射。
如比较silly,stupid.第一个字符相等,那么比较第二个字符i,t。我们只需要记得ASCII码集中小写字母的编码是递增关系,而26字母表,i在t前面,故认为
“i<t”
,比较结束,我们认为silly比stupid小。比较逻辑是这样的。
若两个串长度不一,其中一个串比较完了,那么认为长串更大。
两个串相等的充分必要条件:两个串长度相等且对应字符一一相等。
使用说明
1.若在栈上创建String类型 变量,如String s,需要进行
String s={.Init=StrInit}
,结构体的局部初始化
如下图
#include"String.h"
//很可惜不能实现像Java中的this关键字来隐式传递参数。
int main(){//Object-oriented Programming in CString s={.Init=StrInit};s.Init(&s);s.append(&s,"hello");s.toString(&s);printf("\n");s.append(&s,",world!");s.toString(&s);return 0;
}
2.若在栈上创建一个String* 的指针变量,需要调用newString函数,
String* str=newString();
newString会在堆上创建一个这样的String变量并返回其地址。
int main(){//Object-oriented Programming in CString* str=newString();str->append(str,"hello, ");char* arr="1,2,3,4,5";str->valueOfCharArrays(str,arr);str->toString(str);return 0;
}
3.由于结构体内置freememory函数指针,通过指针来调用函数可以回收自身内存,调用后相当于销毁了自身。若采用指针,请注意将该指针置空。
4.这里麻烦点在于不好好管理内存容易泄露。
结构体说明(串的顺序结构)
以下是动态字符串定义,全称Dynamic String,简称string。
注意前面字段定义,很显然这是顺序结构的定义。
串的顺序结构是用一组地址连续的存储单元存储串中的字符序列,为了摆脱原有字符串的固定性,我们选择堆区的内存以便我们实现动态扩容。
我们把\0踢出在外,但注意\0还是存在,只不过由我们内部函数封装好,始终给\0预留空间,不对外显示,使用不受\0限制。
typedef struct string{//顺序表!】//字段/属性/成员char* a;//字符指针int length;//记录当前字符串的长度,也是有效长度。int capacity;//只记录实际有效的字符容量,不包括'\0','\0'始终额外留一个字节空间。//--------------------------------------------------------------//成员函数,用函数指针模拟一下//get函数int (*getLength)(struct string* self);//获取当前字符串的长度,相当于C库中string函数。//操作字符串函数void (*toString)(struct string* self);//打印字符串void (*append)(struct string* self,const char* str);//连接字符串bool (*empty)(struct string* self);//判断字符串是否为空串。struct string* (*substring)(struct string* self,int startIndex,int endIndex);//原字符串中创建一个对应区间[startIndex,endIndex)的子字符串。//整型,浮点型,字符数组,单个字符的转化为字符串void (*valueOfInt)(struct string* self,int val);void (*valueOfLong) (struct string* self,long val);void (*valueOfFloat) (struct string* self,float val);void (*valueOfDouble) (struct string* self,double val);void (*valueOfCharArrays)(struct string* self,char val[]);//动态字符串之间的操作void (*copyOf)(struct string* self,struct string* other);//动态字符串之间的拷贝。int (*compareTo)(struct string* self,struct string* other);//比较两个字符串大小bool (*equal)(struct string* self,struct string* other);//比较字符串是否相等。int (*indexOf)(struct string* S,struct string* T,int pos);//BF算法求子串在主串指定pos之后的下标。//管理内存 void (*Init)(struct string* str); //字符串普通变量构造函数void (*reset)(struct string* self);//重置字符串,如同一开始初始化一样。效果和newString之后相同。void (*freememory)(struct string* self);//销毁自身,释放所有动态内存。使用此方法后记得将原有指针置空处理。
}String;
函数说明
gitte
测试不够严谨,难免出错。请自行学习,并在评论区指正错误,谢读。
相关文章:
数据结构篇其六-串
数据结构—串 前置说明 由于学习Java面向对象语言走火入魔,试图在C语言中模拟实现面向对象设计。里面加入了大量的函数指针配合结构体来模拟类中的成员方法 故此篇,亦可称: 面向对象的C语言程序设计 用C语言实现串这种数据结构,并将它应用到…...

队列和栈的实现
本节讲解的队列与栈,如果你对之前的线性和链式结构顺利掌握了,那么下边的队列和栈就小菜一碟了。因为我们会用前两节讲到的东西来实现队列和栈。 之所以放到一起讲是因为这两个东西很类似,队列是先进先出结构(FIFO, first in first out)&…...

lua vm 五: upvalue
前言 在 lua vm 中,upvalue 是一个重要的数据结构。upvalue 以一种高效的方式实现了词法作用域,使得函数能成为 lua 中的第一类值,也因其高效的设计,导致在实现上有点复杂。 函数 (proto) upvalue 构成了闭包(closu…...
React Native中集成ArcGIS以显示地图、渲染自定义图层和获取地理信息数据
在您的数据采集上传的应用中集成ArcGIS以显示地图、渲染自定义图层和获取地理信息数据是一项常见需求。下面是如何实现这些功能的详细指南,包括具体步骤和示例代码。 1. 显示地图 原生开发 Android: 使用ArcGIS Android SDK。您需要在AndroidManifest…...

java中的异常-异常处理(try、catch、finally、throw、throws)+自定义异常
一、概述 1、java程序员在编写程序时提前编写好对异常的处理程序,在程序发生异常时就可以执行预先设定好的处理程序,处理程序执行完之后,可以继续向后执行后面的程序 2、异常处理程序是在程序执行出现异常时才执行的 二、5个关键字 1、tr…...

深入了解反射
newInstance 可访问性限制: newInstance()方法只能调用无参的公共构造函数。如果类没有无参公共构造函数,那么newInstance()方法将无法使用。 异常处理: newInstance()方法在创建对象时会抛出受检异常InstantiationException和IllegalAcces…...

5、搭建前端项目
5.1 使用vite vue搭建 win r 打开终端 切换到你想要搭建的盘 npm init vitelatest跟着以下步骤取名即可 cd fullStackBlognpm installnpm run dev默认在 http://localhost:5173/ 下启动了 5.2 用vscode打开项目并安装需要的插件 1、删除多余的 HelloWorld.vue 文件 2、安装…...

LLM之Agent初探
Agent是什么? Agent一词起源于拉丁语中的Agere,意思是“to do”。在LLM语境下,Agent可以理解为在某种能自主理解、规划决策、执行复杂任务的智能体。 Agent并非ChatGPT升级版,它不仅告诉你“如何做”,更会帮你去做。…...

目录穿越漏洞CVE-2018-7171复现 又学到一招小技巧!!!!
还是半夜睡不着,打开靶机开始操作。今天看了文件下载和目录穿越漏洞想结合以及防御方法。半夜来进行操作一波。复现一下漏洞,这个网上的文章页比较的少!!! 开始操作起来!!! 进入到页…...

代码随想录算法训练营day41
题目:01背包理论基础、416. 分割等和子集 参考链接:代码随想录 动态规划:01背包理论基础 思路:01背包是所有背包问题的基础,第一次看到比较懵,完全不知道dp数据怎么设置。具体分析还是dp五部曲ÿ…...
从0~1开发财务软件
1.获取图形验证码接口 功能要求 1、随机生成6位字符 2、将字符生成base64位格式的图片,返回给前端 3、将生成的字符存储到redis中,用匿名身份id(clientId)作为key,验证码作为value。 clientId通过/login/getClien…...

Python实现连连看9
(2)标识选中的图片 在判断出玩家选中的是哪一张图片之后,接下来就可以标识选中的图片了,即在该选中的图片外围画矩形。代码如下所示。 FIRSTCLICK True #FIRSTCLICK是全局变量 if(click_col>0 and click_row>0) and \(no…...

项目验收总体计划书(实际项目验收原件参考Word)
测试目标:确保项目的需求分析说明书中的所有功能需求都已实现,且能正常运行;确保项目的业务流程符合用户和产品设计要求;确保项目的界面美观、风格一致、易学习、易操作、易理解。 软件全套文档过去进主页。 一、 前言 ࿰…...
C++基础与深度解析 | 异常处理 | 枚举与联合 | 嵌套类与局部类 | 嵌套名字空间与匿名名字空间 | 位域与volatile关键字
文章目录 一、异常处理二、枚举与联合三、嵌套类与局部类四、嵌套名字空间与匿名名字空间五、位域与volatile关键字 一、异常处理 异常处理用于处理程序在调用过程中的非正常行为。 传统的处理方法:传返回值表示函数调用是否正常结束。 例如,返回 0 表示…...

番外篇 | 利用华为2023最新Gold-YOLO中的Gatherand-Distribute对特征融合模块进行改进
前言:Hello大家好,我是小哥谈。论文提出一种改进的信息融合机制Gather-and-Distribute (GD) ,通过全局融合多层特征并将全局信息注入高层,以提高YOLO系列模型的信息融合能力和检测性能。通过引入MAE-style预训练方法,进一步提高模型的准确性。🌈 目录 🚀1.论文解…...
python记录之字符串
在Python中,字符串是一种非常常见且重要的数据类型,用于存储文本信息。下面,我们将对Python字符串进行深入的讲解,包括其基本操作、常见方法、格式化以及高级特性。 1. 字符串的创建 在Python中,字符串可以通过单引号…...

Elasticsearch 认证模拟题 - 15
一、题目 原索引 task1 的字段 title 字段包含单词 The,查询 the 可以查出 1200 篇文档。重建 task1 索引为 task1_new,重建后的索引, title 字段查询 the 单词,不能匹配到任何文档。 PUT task1 {"mappings": {"…...
g++ 预处理 编译 汇编 链接 命令
g 预处理 编译 汇编 链接 命令 在命令行中使用 g 预处理、编译、汇编和链接源代码文件通常遵循以下步骤: 预处理(Preprocessing):将源代码文件转换为经过预处理器处理的中间文件。 g -E source.cpp -o source.i 编译ÿ…...
计算机视觉中的low-level与 high-level任务
文章目录 low-level任务high-level任务区别联系others参考在计算机视觉领域中,low-level任务和high-level任务是两个重要的概念,他们分别涉及图像处理和分析的不同的层次。 low-level任务 low-level任务主要关注的是图像的底层特征,如颜色、纹理、边缘、形状等。通常涉及对…...

安徽京准NTP时钟系统:GPS北斗卫星授时下的生活重塑
安徽京准NTP时钟系统:GPS北斗卫星授时下的生活重塑 安徽京准NTP时钟系统:GPS北斗卫星授时下的生活重塑 时间的流逝自古以来时钟都是人类生活与活动的基础。然而,随着科技的进步,我们对时间管理和测量的方法已经发生了翻天覆地的变…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...

ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]
报错信息:libc.so.6: cannot open shared object file: No such file or directory: #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...
6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础
第三周 Day 3 🎯 今日目标 理解类(class)和对象(object)的关系学会定义类的属性、方法和构造函数(init)掌握对象的创建与使用初识封装、继承和多态的基本概念(预告) &a…...
基于鸿蒙(HarmonyOS5)的打车小程序
1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...

算法打卡第18天
从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7…...