数据结构:顺序串
目录
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 模块允许…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
从物理机到云原生:全面解析计算虚拟化技术的演进与应用
前言:我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM(Java Virtual Machine)让"一次编写,到处运行"成为可能。这个软件层面的虚拟化让我着迷,但直到后来接触VMware和Doc…...
