数据结构:顺序串

目录

        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);
}

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

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

相关文章

51单片机-实机演示(LED点阵)

目录 前言: 一.线位置 二.扩展 三.总结 前言: 这是一篇关于51单片机实机LED点阵的插线图和代码说明.另外还有一篇我写的仿真的连接在这:http://t.csdnimg.cn/ZNLCl,欢迎大家的点赞,评论,关注. 一.线位置 接线实机图. 引脚位置注意: 1. *-* P00->RE8 P01->RE7 …

Android Kotlin 异步操作回调转换为挂起函数

异步接口回调是一种通过接口将任务的执行和结果处理分离开来的编程设计模式。通常用于网络请求、数据库查询等耗时操作。 挂起函数是 Kotlin 中的一个特性&#xff0c;用于简化异步编程。挂起函数是可以在协程中暂停执行并恢复的函数&#xff0c;避免了回调地狱问题&#xff0…

Golang | Leetcode Golang题解之第137题只出现一次的数字II

题目&#xff1a; 题解&#xff1a; func singleNumber(nums []int) int {a, b : 0, 0for _, num : range nums {b (b ^ num) &^ aa (a ^ num) &^ b}return b }

AI视频教程下载:生成式AI—从入门到精通

生成式人工智能正在彻底改变我们的生活。 本视频教程让您全面了解生成式人工智能的基本概念、模型、工具和应用&#xff0c;使您能够利用生成式人工智能的潜力&#xff0c;改善工作场所、事业和生活。 该视频教程由五门自定进度的短期课程组成&#xff0c;每门课程需要 3-5 个…

ChatGPT-4o在临床医学日常工作、数据分析与可视化、机器学习建模中的技术

2022年11月30日&#xff0c;可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT-3.5&#xff0c;将人工智能的发展推向了一个新的高度。2023年11月7日&#xff0c;OpenAI首届开发者大会被称为“科技界的春晚”&#xff0c;吸引了全球广大…

SQL查询的优化方案

SQL查询优化是一个重要的数据库管理任务&#xff0c;它可以帮助提升查询性能&#xff0c;减少响应时间和系统资源消耗。以下是一些关键的优化策略及其示例&#xff1a; 1. 使用索引 (Indexing) 优化说明: 索引能够显著加快数据检索速度&#xff0c;特别是对于大表上的查询。为…

【中心拓展法-BM73 最长回文子串】

题目 BM73 最长回文子串 分析 中心拓展法&#xff1a; 中心有两种&#xff1a; 将字母作为中心&#xff08;starti,end i)&#xff0c;将字母后的间隙作为中心(start i, end i1) 此时要注意begin 和end之间字母数量的计算&#xff1a; begin 和end 之间的字母数量应为…

数据挖掘--数据预处理

数据清理 缺失值 如果数据集含有分类属性&#xff0c;一种简单的填补缺失值的方法为&#xff0c;将属于同一类的对象的该属性值的均值赋此缺失值&#xff1b;对于离散属性或定性属性&#xff0c;用众数代替均值。更复杂的方法&#xff0c;可以将其转换为分类问题或数值预测问…

python项目中到底使用什么解释器更合适?

在Python开发中&#xff0c;选择使用项目专用的解释器还是系统共用的解释器主要取决于你的项目需求、团队协作规范以及对环境隔离的需求。下面是一些指导原则来帮助你决定&#xff1a; 项目专用解释器&#xff08;虚拟环境&#xff09; 优点: 环境隔离&#xff1a;每个项目拥…

再次修改了备忘录

Control <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>与妖为邻备忘录</title><!-- <…

如何挑选最适合你的渲染工具

随着技术的发展&#xff0c;云渲染平台逐渐成为设计师、动画师、影视制作人员等创意工作者的得力助手。然而&#xff0c;市场上的云渲染平台种类繁多&#xff0c;如何选择最适合自己的渲染工具成为了一个需要认真考虑的问题。 在挑选适合自己的云渲染工具时&#xff0c;我们需…

系统与软件工程软件测试文档

组织级软件测试文档结构图集 组织级测试过程文档集 组织级测试规格说明描述组织层面的测试信息&#xff0c;并且不依赖于项目。其在组织级测试过程中的典型事例包括&#xff1a; 测试方针&#xff1a;测试方针定义了组织内适用的软件测试的目的和原则&#xff0c;它定义了测试…

哈希表和二维矩阵的结合-2352. 相等行列对(新思路、新解法)

题目链接及描述 . - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/equal-row-and-column-pairs/description/?envTypest…

AIGC+营销:AI在营销领域的演变与营销人员的新角色

一、AI在营销领域的演变 随着AI技术的不断发展&#xff0c;营销领域也迎来了新的变革。从目前的“AI Copilot”阶段&#xff0c;到未来的“AI Agent”和“AI自主营销团队”阶段&#xff0c;AI的角色将逐渐从辅助人类到独立承担更多职责。 AI Copilot&#xff08;副驾驶&#…

Python初步使用教程

1.基本输出print函数 a10 b20 print(a)#输出结束后会自动换行 print(b) print(a,b,猪猪侠)#print中sep决定三者之间会存在空格#连接方法一 print(猪猪,end) print(侠) #连接方法二&#xff08;只能是字符串和字符串连&#xff09; print(超级无敌)print(chr(67)) print(ord(猪…

lua vm 五: upvalue

前言 在 lua vm 中&#xff0c;upvalue 是一个重要的数据结构。upvalue 以一种高效的方式实现了词法作用域&#xff0c;使得函数能成为 lua 中的第一类值&#xff0c;也因其高效的设计&#xff0c;导致在实现上有点复杂。 函数 (proto) upvalue 构成了闭包&#xff08;closu…

【笔记】Python编程:从入门到实践(第2版) - 埃里克·马瑟斯

第一部分 基础知识 第1章 安装Python 第2章 变量中存储信息 name "ada lovelace" name.title() # 首字母大写的方式显示每个单词# Ada Lovelace print(name.upper()) # 全部大写 ADA LOVELACE print(name.lower()) # 全部小写 ada lovelace# 在字符串中插入变量的…

王学岗鸿蒙开发(北向)——————(四、五)ArkUi声明式组件

1,注意&#xff0c;如上图&#xff0c;build只能有一个根节点 2,Entry表示程序的入口 Component表示自定义的组件 Preview表示可以预览 3&#xff0c;图片存放的地方 4&#xff0c; build() {Row() {//图片不需要写后缀Image($r(app.media.icon)).width(300) //宽有两种写法&…

监控摄像机接入GB28181平台如何获取监控视频

各种型号监控摄像头或硬盘录像机接入 GB28181平台配置过程非常简单明了&#xff0c;但有些细节需要注意&#xff0c;避免走弯路。 1、基本要求 &#xff08;1&#xff09;网络要求 总的来说&#xff0c;只要监控设备和GB28181平台的网络是连通的&#xff0c;设备可以主动访问…

问题:学生品德不良的矫正与教育可以采取以下措施()。 #其他#学习方法#微信

问题&#xff1a;学生品德不良的矫正与教育可以采取以下措施()。 A、创设良好的交流环境,消除情绪障碍 B、提高道德认识,消除意义障碍 C、锻炼学生与诱因作斗争的意志力 D、消除习惯惰性障碍 E、发现积极因素,多方法协同进行,促进转化 参考答案如图所示