数据结构:顺序串
目录
1.顺序串是什么?
2.顺序串常见操作和应用
3.包含头文件
4.结点设计
5.接口函数定义
6.接口函数实现
7.顺序串测试案列
顺序串是什么?
顺序串,用于存储和操作字符串。在顺序串中,字符串被存储在一个连续的内存块中,通常是数组或动态数组(如C++中的std::vector或Java中的ArrayList)。顺序串的主要优点是它提供了一种简单且高效的方式来访问和修改字符串中的字符。以下是顺序串的特点:
1.连续内存:字符串的所有字符都存储在连续的内存位置,这有助于提高访问速度
2.动态扩展:顺序串通常使用动态数组实现,这意味着它们可以根据需要自动扩展其大小
3.随机访问:由于字符串存储在数组中,任何字符都可以在常数时间内被访问,即O(1)时间复杂度
顺序串常见操作和应用
要实现顺序串需要实现以下操作:
1.访问字符:可以直接通过索引访问字符串中的任何字符
2.修改字符:可以直接通过索引修改字符串中的任何字符
3.插入字符:可以在字符串的任何位置插入字符,但可能需要移动插入点后的所有字符
4.删除字符:可以从字符串中删除任何字符,但可能需要移动删除点后的所有字符。
5.连接字符串:可以将两个或多个字符串连接在一起,通常需要扩展数组并复制字符
顺序串的应用:
1.文本编辑:顺序串常用于文本编辑器中,用于存储和操作文本数据
2.字符串处理:在需要频繁访问和修改字符串的场景下,顺序串提供了一种高效的数据结构
包含头文件
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
结点设计
#define Initsize 10
typedef char Elemtype;typedef struct SqString {Elemtype data[Initsize]; //定义数组data为数据域,存储数据int length; //定义变量length存储串长度
}SqString;
接口函数定义
bool InitString(SqString& A); //用于初始化顺序串
bool Assign(SqString& A, char str[]); //用于将字符数组中的数据赋值给顺序串
bool StringCopy(SqString& A, SqString B); //用于将B顺序串数据复制到A顺序串
bool Strlen(SqString A, SqString B); //用于判断两个顺序串是否相等
SqString Concat(SqString A, SqString B); //用于将两个字符串连接
bool Index(SqString A, SqString B); //用于查找子串的位置
bool InsertStr(SqString& A, SqString B, int i); //用于在顺序串中插入子串
bool InsertString(SqString& A); //用于在顺序串中输入数据
bool IdlString(SqString& A, int i, int j); //用于选定删除子串
void DispStr(SqString A); //用于输出顺序串
//用于在顺序串中查找等长度的子串,i为开始的次序,j为子串长度
SqString SubStr(SqString A, int i, int j);
接口函数实现
void DispStr(SqString A) { //用于输出顺序串if (A.length == 0) { //为减少存储空间,判断是否为空串printf("传入的顺序串为空串");}else {int i;for (i = 0; i < A.length; i++) {//遍历输出串printf("%c", A.data[i]);}}
}bool IdlString(SqString& A, int i, int j) { //用于选定删除子串if (i<1 || i>A.length || j<1 || j + i>A.length + 1) { //判断传入的次序是否有误printf("传入的次序或长度有误");return false;}else {int k;for (k = i-1+j; k < A.length; k++) { //删除特定次序的子串A.data[i - 1] = A.data[k];i++;}A.length -= j; //更新顺序串的大小return true;}
}bool InsertString(SqString& A) { //用于在顺序串中输入数据int i;char x[Initsize]; //定义一个字符数组存储字符printf("创建的顺序串大小为%d,请问需要输入多少个数据:",Initsize);scanf_s("%d", &A.length);if (A.length == 0) {return false;}printf("请输入数据:");getchar(); //清除计算机缓存区gets_s(x, A.length+1); //使用get_s函数从键盘键入数据,大小为A.length+1for (i = 0; i <A.length; i++) { //更新顺序串数据A.data[i] = x[i];}return true;
}bool InsertStr(SqString& A, SqString B, int i) { //用于在顺序串中插入子串int j,k=A.length-1;if (i<1 || i>A.length + 1) { //判断传入的次序是否合理printf("插入的位序不合理\n");return false;}else {if (i + B.length +A.length> Initsize) { //判断顺序串是否有空间存储插入的子串printf("传入的顺序串所剩的空间不足\n");return false;}else {for (j = A.length + B.length; j >= A.length; j--) //遍历顺序串,将传入的次序后的数据后移{A.data[j] = A.data[k];k--;}k = 0;for (j = i - 1; j < A.length; j++) { //遍历顺序串,将子串插入对应的次序中A.data[j] = B.data[k];k++;}}}A.length += B.length; //更新顺序串的长度lengthprintf("在顺序表中插入子串成功\n");return true;
}bool Index(SqString A, SqString B) { //用于查找子串的位置int i=0, j=0, len=0;while (i < A.length && j < B.length) { //遍历传入顺序表和子串if (A.data[i] == B.data[j]) { //判断传入的子串是否在传入的顺序表中len = i; //记录子串的位置i++;j++;}else {len = 0; j = 0;i++;}}if (j >= B.length) { //判断是否在顺序表中找到对应的子串printf("已找到对应的子串,其子串位于主串的第%d个到第%d个位置\n",len,len+B.length-1);return true;}else {printf("找不到对应的子串\n");return false;}
}SqString SubStr(SqString A, int i, int j) { //用于在顺序串中查找等长度的子串,i为开始的次序,j为子串SqString C; //定义顺序串C,储存查找到的子串if (i > A.length || i+j > A.length+1 || i<1 ||j<1) {//判断传入的次序和长度是否合理C.length = 0; //更新顺序串C的长度printf("传入的长度参数错误,找不到子串\n");return C;}else {int K;for (K = i - 1; K < i + j - 1; K++) {C.data[K - i + 1] = A.data[K]; //将查找到的子串赋值给顺序串C}C.length = j; //更新顺序串C的长度}return C;
}SqString Concat(SqString A, SqString B) { //定义函数Concat用于将两个字符串连接SqString C; //定义顺序串C存储连接结果的数据int i,j;for (i = 0; i < A.length; i++) { //将顺序串A的数据赋值给新的顺序串CC.data[i] = A.data[i];}for (j=0; j < B.length; j++) { //将顺序串B的数据赋值给新的顺序串CC.data[A.length+j] = B.data[j];}C.length = i + j; //更新顺序串C的长度lengthprintf("传入的两个顺序串连接成功\n");return C;
}bool Strlen(SqString A, SqString B) { //用于判断两个顺序串是否相等if (A.length != B.length) { //判断传入的顺序串长度length是否相等printf("顺序串长度不相等\n");return false;}else {int i;for (i = 0; i < A.length; i++) { //遍历两个顺序串判断所含数据是否相等if (A.data[i] != B.data[i]) {printf("顺序串中所含数据不相等\n");return false;}}printf("传入的顺序串数据相等\n");return true;}
}bool StringCopy(SqString& A, SqString B) { //用于将B顺序串数据复制到A顺序串if (A.length < B.length) { //判断要复制的顺序串长度是否大于新的顺序串printf("要复制的顺序串长度大于新的顺序串\n");return false;}else {int i=0;while (i < B.length) { //遍历要复制的顺序串A.data[i] = B.data[i];i++;}printf("顺序串复制成功\n");A.length = B.length; //更新新的顺序串的长度lengthreturn true;}
}bool Assign(SqString& A, char str[]) { //用于将字符数组中的数据赋值给顺序串if (strlen(str) > Initsize) { //判断传入的字符数组数据是否过大printf("字符数组过大,顺序串存储不足\n");return false;}else {int i = 0;while (str[i] != '\0') { //遍历字符数组并将其数据赋值到顺序串A.data[i] = str[i];i++;}A.length = i; //更新顺序串长度lengthprintf("赋值成功\n");return true;}
}bool InitString(SqString& A) { //用于初始化顺序串A.length = 0; //将串中length赋初值为0printf("顺序串初始化成功\n");return true;
}
顺序串测试案列
void main() {SqString X,Y,Z;InitString(X);InitString(Y);InsertString(X);InsertString(Y);DispStr(X);printf("\n");Index(X, Y);
}相关文章:
数据结构:顺序串
目录 1.顺序串是什么? 2.顺序串常见操作和应用 3.包含头文件 4.结点设计 5.接口函数定义 6.接口函数实现 7.顺序串测试案列 顺序串是什么? 顺序串,用于存储和操作字符串。在顺序串中,字符串被存储在一个连续的内存块中,…...
掌握复选框(Checkbox)的奥秘:全选与反选功能实现
前言: 在网页设计中,复选框(Checkbox)是一种常见且实用的交互元素,它允许用户从一系列选项中选择多个项。无论是电子商务网站上的商品筛选,还是在线表单的数据收集,复选框都发挥着重要作用。然…...
一篇文章带你搞懂C++引用(建议收藏)
引用 6.1 引用概念 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。 比如:李逵,在家称为"铁牛",江湖上人称&quo…...
查询SQL:文章浏览1
问题描述 请查询出所有浏览过自己文章的作者 结果按照 id 升序排列。 查询结果的格式如下所示: 题目分析: 这题主要考察排序asc(升序)、desc(降序)以及distinct字段。 解决方案: select DIS…...
android 在onCreate方法中获得view的宽高
view在绘制完成后才会有自己的宽高,所以在onCreate中要获得view的宽高可以通过以下4中方法: 1、ViewTreeObserver:监听界面绘制事件,在layout时调用,使用完毕后记得removeListener 2、view.post,因为runn…...
SOA主要协议和规范
Web服务作为实现SOA中服务的最主要手段。首先来了解Web Service相关的标准。它们大多以“WS-”作为名字的前缀,所以统称“WS-*”。Web服务最基本的协议包括UDDI、WSDL和SOAP,通过它们,可以提供直接而又简单的Web Service支持,如图…...
30、matlab现代滤波:维纳滤波/LMS算法滤波/小波变换滤波
1、信号1和信号2的维纳滤波 实现代码 N 2000; %采样点数 Fs 2000; %采样频率 t 0:1 / Fs:1 - 1 / Fs; %时间序列 Signal1 sin(2*pi*20* t) sin(2*pi*40* t) sin(2*pi*60* t); Signal2[2*ones(1,50),zeros(1,50),-1*ones(1,100),zeros(1,50),-2*ones(1,50),zeros(1,50),1…...
HTML5 视频 Vedio 标签详解
HTML5 引入了 <video> 标签,允许开发者在网页中直接嵌入视频文件,而不需要依赖第三方插件。本文将全面介绍 <video> 标签的各种属性,并通过实例代码详细说明其用法。 一、基础用法 1. 基本结构 HTML5 中使用 <video> 标…...
三十五篇:数字化转型的引擎:赋能企业的ERP系统全景
数字化转型的引擎:赋能企业的ERP系统全景 1. 引言 在这个快速变化的数字时代,现代企业面临着前所未有的挑战和机遇。企业资源计划(ERP)系统,作为数字化转型的核心,扮演着至关重要的角色。它不仅是企业运营…...
利用ArcGIS对长江三角洲地区的gdp水平进行聚类
1、导入矢量图、数据 长三角地区矢量图 长三角地区矢量图对应数据 2、连接 3、设置属性将人均gdp数据导入 4、设置标注和图例 选择布局视图 5、聚类 2020年人均gdp地区聚类 6、2005~2020年各地区人均gdp可视化及聚类汇总 (1)2005~2020可视化 2005 …...
释放视频潜力:Topaz Video AI for mac/win 一款全新的视频增强与修复利器
在数字时代,视频已经成为我们记录生活、分享经历的重要方式。然而,有时候我们所拍摄的视频可能并不完美,可能存在模糊、噪点、抖动等问题。这时候,就需要一款强大的视频增强和修复工具来帮助我们提升视频质量,让它们更…...
MongoDB 正则表达式详解:高效数据查询与处理技巧
MongoDB 的正则表达式(Regular Expression)功能允许在查询中进行模式匹配和文本搜索,为用户提供了强大的灵活性。 基本语法 MongoDB 中使用正则表达式时,通常是在查询语句中使用 $regex 操作符。基本语法如下: { &l…...
第二十六章HTML与CSS书写规范
1.HTML书写规范 1.文档类型声明及编码 统一为html5 声明类型。编码统一为utf-8。 2.页面tdk TDK是一个缩写,其中“T”表示为网页定义标题,“D”表示为网页定义描述 description,“K”表示为搜索引擎定义关键词keywords。 1、<title&g…...
基于FPGA的AD5753(DAC数模转换器)的控制 II(SPI驱动)
基于FPGA的AD5753(DAC数模转换器)的控制 II(已上板验证) 语言 :Verilg HDL EDA工具:Vivado 基于FPGA的AD5753(DAC数模转换器)的控制 II(已上板验证)一、引言二…...
【全开源】Java同城服务同城信息同城任务发布平台小程序APP公众号源码
📢 连接你我,让任务触手可及 🌟 引言 在快节奏的现代生活中,我们时常需要寻找一些便捷的方式来处理生活中的琐事。同城任务发布平台系统应运而生,它为我们提供了一个高效、便捷的平台,让我们能够轻松发布…...
[Redis]List类型
列表类型来存储多个有序的字符串,a、b、c、d、e 五个元素从左到右组成了一个有序的列表,列表中的每个字符串称为元素,一个列表最多可以存储个元素。在 Redis 中,可以对列表两端插入(push)和弹出(…...
export 和 export default 的区别
在 JavaScript 中,export 和 export default 都是用于导出模块中的内容的关键字,但它们有一些区别: export: export 关键字用于导出多个变量、函数或对象。可以一次导出多个内容,并且在导入时需要使用对应的名称。例如:…...
29网课交单平台 epay.php SQL注入漏洞复现
0x01 产品简介 29网课交单平台是一个专注于在线教育和知识付费领域的交单平台。该平台基于PHP开发,通过全开源修复和优化,为用户提供了高效、稳定、安全的在线学习和交易环境。作为知识付费系统的重要组成部分,充分利用了互联网的优势,为用户提供了便捷的支付方式、高效的…...
推荐ChatGPT4.0——Code Copilot辅助编程、Diagrams: Show Me绘制UML图、上传PDF并阅读分析
5月14日凌晨1点、太平洋时间的上午 10 点,OpenAI的GPT-4o的横空出世,再次巩固了其作为行业颠覆者的地位。GPT-4o的发布不仅仅是一个产品的揭晓,它更像是向世界宣告AI技术已迈入了一个全新的纪元,连OpenAI的领航者萨姆奥特曼也不禁…...
rollup.js(入门篇)
前沿 Rollup 是一个用于 JavaScript 的模块打包工具,它将小的代码片段编译成更大、更复杂的代码,例如库或应用程序。它使用 JavaScript 的 ES6 版本中包含的新标准化代码模块格式,而不是以前的 CommonJS 和 AMD 等特殊解决方案。ES 模块允许…...
网易云音乐评论数据分析:用Python爬取+可视化热门歌曲情感倾向
网易云音乐评论数据挖掘:从爬取到情感分析的完整实战指南 音乐平台的用户评论蕴含着丰富的情感价值和商业洞察。作为国内领先的音乐社区,网易云音乐的海量评论数据对产品经理优化功能、市场人员分析用户偏好具有重要价值。本文将系统性地介绍如何通过Pyt…...
Unity 工具之(SharpZipLib)跨平台中文Zip压缩与解压实战指南(附多线程优化)
1. 为什么选择SharpZipLib处理Unity中的Zip文件 在Unity项目开发中,资源打包和网络传输经常需要处理压缩文件。SharpZipLib作为.NET平台的老牌压缩库,相比Unity内置的压缩方案有三个不可替代的优势: 首先是对中文路径的完美支持。很多开发者都…...
AI小白进阶必看!吴恩达教你用“职业技能包“让AI像专业员工一样工作(收藏版)
本文系统拆解了吴恩达联合Anthropic推出的Agent Skills视频课程,深入浅出地讲解了如何通过构建"职业技能包"(Skills),让通用AI Agent在具体业务场景中像专业员工一样可靠工作。文章从Agent Skills的定义、必要性、能力维…...
AI大模型岗位薪资揭秘:2026大模型岗位薪资,非常详细收藏我这一篇就够了
1. AI系统架构师 薪资范围:100万 - 200万/年 职位要求:需要具备全面的技术背景,精通系统架构设计,能够有效整合AI技术,提升系统性能。要求硕士及以上学历,计算机科学或相关专业背景。 目标院校࿱…...
手把手教你用STM32F103驱动ST7565R芯片的JLX12864G屏幕(附取模工具配置)
STM32F103驱动ST7565R液晶屏的深度开发指南 在嵌入式显示领域,128x64分辨率的单色液晶屏因其性价比高、接口简单而广受欢迎。本文将深入探讨基于STM32F103微控制器驱动ST7565R芯片的JLX12864G液晶屏的完整技术方案,从硬件连接到高级显示功能的实现&#…...
3步玩转Balena Etcher:开源镜像烧录工具完全指南
3步玩转Balena Etcher:开源镜像烧录工具完全指南 【免费下载链接】etcher Flash OS images to SD cards & USB drives, safely and easily. 项目地址: https://gitcode.com/GitHub_Trending/et/etcher Balena Etcher是一款开源跨平台镜像烧录工具&#x…...
python基于微信小程序的旅游攻略分享平台
目录需求分析与功能规划技术架构设计数据库设计接口开发小程序前端开发部署与测试运营与迭代注意事项项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作需求分析与功能规划 明确平台核心功能:用户注册登录、攻略发布与…...
小白程序员必看:收藏这份上下文工程指南,轻松玩转大模型!
本文深入浅出地介绍了上下文工程在大语言模型中的重要性,阐述了指令、示例、知识、记忆、工具和安全护栏等六种上下文类型。文章详细解析了上下文工程的四个基本阶段:撰写上下文、选择上下文、压缩上下文和隔离上下文,并强调了上下文窗口的作…...
通义千问3-Reranker-0.6B效果惊艳:数学证明步骤间逻辑连贯性重排序
通义千问3-Reranker-0.6B效果惊艳:数学证明步骤间逻辑连贯性重排序 1. 模型介绍与核心能力 通义千问3-Reranker-0.6B是Qwen3 Embedding模型系列的最新成员,专门针对文本重排序任务进行了深度优化。这个6亿参数的模型虽然体积小巧,但在数学证…...
3步掌握PAGExporter:After Effects动画高效导出完整指南
3步掌握PAGExporter:After Effects动画高效导出完整指南 【免费下载链接】libpag The official rendering library for PAG (Portable Animated Graphics) files that renders After Effects animations natively across multiple platforms. 项目地址: https://g…...
