【数据结构】串的基本定义及操作

news2024/12/24 9:08:51

🎇[数据结构]串的基本定义及操作🎇



🌈积薪高于山,焉用先后别 🌈

在这里插入图片描述


🌟 正式开始学习数据结构啦~此专栏作为学习过程中的记录🌟


文章目录

  • 🎇[数据结构]串的基本定义及操作🎇
  • 🍰一.串的定义及实现
  • 🍰二.串的实现
    • 🚀1.串的存储方式
      • 🔆1.顺序存储
      • 🔆2.堆存储
      • 🔆3.块链存储
    • 🚀2.串的基本操作
      • 🔆1.串的初始化
      • 🔆2.求子串
      • 🔆3.比较串
      • 🔆4.定位串
      • 🔆5.串的赋值


🍰一.串的定义及实现

概念熟记:

是由0个或多个字符组成的有限的序列,记作 S = ′ a 1 a 2 . . . a n ′ S='a_1a_2...a_n' S=a1a2...an,其中,当 n = 0 n=0 n=0时表示空串

中任意多个连续的字符组成的子序列称为子串,包含子串的串称为主串

两个串的长度相等且每一个元素都相同,则这两个串相等

在这里插入图片描述


比较线性表和串:

  1. 在逻辑结构上:串和线性表即为相似,区别仅为串的数据对象为字符集(如:数字,英文,中文,符号等)
  2. 在操作上:串和线性表的操作大有不同,主要体现在操作对象上:
    ① ① 线性表的操作对象一般为单个元素
    ② ② 串的操作对象一般为子串

在这里插入图片描述

🎯 怎么理解操作对象为子串?
因为往往需要多个字符才能表达出完整的实际意义,比如: ′ w o r d ′ 'word' word ,若把他们拆解为 { ′ w ′ , ′ o ′ , ′ r ′ , ′ d ′ } \{'w','o','r','d'\} {w,o,r,d},并不能很好地体现它的实际含义,中文也类似,一个汉字也难以体现,所以将他们看做是一个整体来处理,与单个元素不同



🍰二.串的实现

🚀1.串的存储方式

🔆1.顺序存储

顺序存储,即用一片连续的内存空间存储字符串序列

//静态存储
#define Maxsize 50

typedef struct {
	char ch[Maxsize]; //字符串数组
	int len;
}SString;

💊注意:当串的长度超过最大长度时,串会被截断,也就是之后的字符将不会保留

串的表示方式:

  1. ✳️字符从数组下标为0的位置开始存放,长度单独开辟一个变量空间存储:

在这里插入图片描述

优点:长度变量 l e n g t h length length i n t int int 型变量,可以存放的数据范围大;
缺点:字符的位置与下标不对齐


  1. ✳️数组的首位置用len填充
    在这里插入图片描述

优点:字符位置与数组下标对齐
缺点:此时的长度变量 l e n g t h length length 只能为 c h a r char char 类型,若长度 > 255 >255 >255,则会溢出,无法记录


  1. ✳️在字符串数组的后面添加一个结束标志’\0’

在这里插入图片描述


优点:不用单独存放长度变量,到结束标志符’\0’时自动结束
缺点:若要频繁使用长度时,每一次都需要遍历得到长度,效率低


  1. 首元素不存放,从下标为1开始,且单独开辟空间存放长度变量

在这里插入图片描述


优点既可以满足数组下标与字符位置对齐,又可以保证变量足够表示长度


🔆2.堆存储

堆分配存储依然需要开辟一片连续的存储单元去存放字符串数组,但不同的是,他们的 存储空间是在使用过程中动态分配获得的

#include<iostream>
using namespace std;

typedef struct {
	char *ch; //字符串数组
	int len;
}HString;

🔆3.块链存储

类似地,串也可以用链式存储,由于串的特殊性,每个元素只有一个字符,因此,我们可以构造每个结点,既可以存放一个字符,也可以存放多个字符,则将每个结点称为,整个链表称为块链结构

在这里插入图片描述
在这里插入图片描述


由于指针占4B,每一个字符占1B,因此,我们可以存放四个结点,尽可能降低存储密度

#include<iostream>
using namespace std;

typedef struct {
	char ch[4]; //字符串数组,每个结点存多个字符
	struct StringNode *next;
}StringNode,*String;

🚀2.串的基本操作

🔆1.串的初始化

将字符串数组的长度设为0,实现逻辑上的空串

void InitString(SString& S) {
	S.len = 0; //逻辑上的初始化
}

🔆2.求子串

在这里插入图片描述

bool SubString(SString& Sub, SString S, int pos, int len) { //Sub为子串,S为主串
	if (pos + len - 1 > S.len) //如果求的子串长度比总长度要大,则返回
		return false;
	for (int i = pos; i <= pos + len - 1; i++) {
		Sub.ch[i - pos + 1] = S.ch[i]; //第一个元素不存
	}
	Sub.len = len;
	return true;
}

🔆3.比较串

在这里插入图片描述
在这里插入图片描述

int StrCompare(SString S, SString T) {
	for (int i = 1; i <= S.len && i <= T.len; i++) { //同时在两个串长以内
		if (S.ch[i] != T.ch[i])
			return S.ch[i] - T.ch[i]; //返回该元素的ASCII差值
	}
	return S.len - T.len; //如果扫描过的字符全部相同,则长的更大
}

🔆4.定位串

在这里插入图片描述

int Index(SString S, SString T) { //定位子串T在主串S中的位置
	int i = 1, n = S.len, m = T.len;
	SString sub; //记录子串
	while (i <= n - m + 1) {
		SubString(sub, S, i, m); //求子串
		if (StrCompare(sub, T) != 0)  //每一次都比较子串和T,如果子串不等于T,继续遍历下一个子串
			++i;
		else
			return i;
	}
	return 0;
}

🔆5.串的赋值

c h a r s chars chars 的值赋值给 S S S中的字符串数组

注意:由于字符串是以’\0’结束的,所以可以以此作为判断条件

void StrAssign(SString& S, char chars[]) {
	int len = strlen(chars);
	for (int i = 1; i <= len; i++) {
		if (chars[i-1] != '\0')
		{
			S.ch[i] = chars[i-1];
			S.len++;
		}
	}
}

完整代码实现:

#include<iostream>
#define Maxsize 50
#include<cstring>
using namespace std;

typedef struct {
	char ch[Maxsize]; //字符串数组
	int len;
}SString;

// 1.初始化
void InitString(SString& S) {
	S.len = 0; //逻辑上的初始化
}

//2.求子串
bool SubString(SString& Sub, SString S, int pos, int len) { //Sub为子串,S为主串
	if (pos + len - 1 > S.len) //如果求的子串长度比总长度要大,则返回
		return false;
	for (int i = pos; i <= pos + len - 1; i++) {
		Sub.ch[i - pos + 1] = S.ch[i]; //第一个元素不存
	}
	Sub.len = len;
	return true;
}

//3.比较串
int StrCompare(SString S, SString T) {
	for (int i = 1; i <= S.len && i <= T.len; i++) { //同时在两个串长以内
		if (S.ch[i] != T.ch[i])
			return S.ch[i] - T.ch[i]; //返回该元素的ASCII差值
	}
	return S.len - T.len; //如果扫描过的字符全部相同,则长的更大
}


//4.定位
int Index(SString S, SString T) { //定位子串T在主串S中的位置
	int i = 1, n = S.len, m = T.len;
	SString sub; //记录子串
	while (i <= n - m + 1) {
		SubString(sub, S, i, m); //求子串
		if (StrCompare(sub, T) != 0)  //每一次都比较子串和T,如果子串不等于T,继续遍历下一个子串
			++i;
		else
			return i;
	}
	return 0;
}

//5.赋值
void StrAssign(SString& S, char chars[]) {
	int len = strlen(chars);
	for (int i = 1; i <= len; i++) {
		if (chars[i-1] != '\0')
		{
			S.ch[i] = chars[i-1];
			S.len++;
		}
	}
}

//6.输出
void Print(SString S) {
	for (int i = 1; i <= S.len; i++) {
		cout << S.ch[i];
	}cout << endl;
}


int main() {
	SString S, T;
	InitString(S);
	InitString(T);

	char s[] = "yanruixiaobao";
	char t[] = "ruixiao";

	StrAssign(S, s);
	StrAssign(T, t);

	//打印
	cout << "串S和T为:" << endl;
	Print(S);
	Print(T);

	cout << "子串T在S中的位置为:" << Index(S, T) << endl;

	system("pause");
	return 0;
}

输出结果:

在这里插入图片描述


🎇本节讲解串的基本定义及操作,后续将更新与串相关的算法~🎇

如有错误,欢迎指正~!


在这里插入图片描述

🙏如果觉得有帮助,就赏个三连吧~👈

在这里插入图片描述

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

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

相关文章

【运维心得】SAP EPM Add-In加载错误的另类解决方案

关键字&#xff1a;SAP BPC EPM OFFICE WPS 今天又解决了一个诡异的问题&#xff0c;记录一下&#xff0c;以备将来能够用上。 目录 问题现象 网上的方法 启发和解决 结论 问题现象 财务SAP系统需要BPC模块做报表&#xff0c;安装了OfficeEPM Add-In以后&#xff0c;结果…

抖音私域怎么做?

“私域流量”是如今备受市场瞩目的话题之一。众所周知&#xff0c;腾讯、阿里巴巴、抖音等互联网巨头已经开始布局私域资源&#xff0c;因此许多企业都希望在这些平台上获取生意增长。作为具有6亿日活跃用户的短视频平台&#xff0c;抖音也为企业提供了私域运营的阵地。那么&am…

2023年湖北黄冈人社局初、中级职称怎么评?申报条件是什么?启程别

2023年湖北黄冈人社局初、中级职称怎么评&#xff1f;申报条件是什么&#xff1f;启程别 想要评过人社局的初、中级职称&#xff0c;首先要满足申报条件&#xff0c;其次是要准备好申报资料&#xff0c;最后等待申报时间提交资料&#xff0c;等待结果。湖北目前改外全面线上申报…

SAP从入门到放弃系列之BOM技术类型-派生BOM-Part5

文章导航目录 一、概述二、基本概念-BOM技术类型三、BOM技术类型详解3.1、BOM技术类型-简单BOM&多重BOM 3.2、BOM技术类型-派生BOM 四、测试示例&#xff1a;4.1、数据准备4.2、创建派生BOM4.3、调整BOM组&#xff0c;更新派生BOM 一、概述 本来想在介绍BOM组的时候写这个…

hbase协处理器编码实例

Observer协处理器通常在一个特定的事件&#xff08;诸如Get或Put&#xff09;之前或之后发生&#xff0c;相当于RDBMS中的触发器。Endpoint协处理器则类似于RDBMS中的存储过程&#xff0c;因为它可以让你在RegionServer上对数据执行自定义计算&#xff0c;而不是在客户端上执行…

MATLAB 之 对话框设计实例和菜单设计

这里写目录标题 一、对话框设计实例1. 数值转化2. 图形演示 二、菜单设计1. 建立用户菜单2. 菜单对象常用属性3. 快捷菜单 一、对话框设计实例 在上一篇博客当中&#xff0c;我们介绍了控件的基本操作&#xff0c;这是建立对话框的基础。下面我们举两个例子&#xff0c;用以说…

软件测试工程师最常用的Linux系统命令大全(汇总)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 cd命令 这是一个…

最新导则下生态环评报告编制技术

根据生态环评内容庞杂、综合性强的特点&#xff0c;依据生态环评最新导则&#xff0c;将内容分为4大篇章(报告篇、制图篇、指数篇、综合篇)、 10大专题(生态环评报告编制、土地利用图的制作、植被类型及植被覆盖度图的制作、物种适宜生境分布图的制作、生物多样性测定、生物量…

开窗函数之聚合、取特定值、排名

一&#xff0c; 聚合开窗函数sum(score) over(partition by name ) 二&#xff0c;开窗函数之first_value&#xff0c;last_value&#xff0c;lead&#xff0c;lag 三&#xff0c;排名开窗函数ROW_NUMBER、DENSE_RANK、RANK 一&#xff0c;开窗函数的语法 开窗函数的语法为&am…

Pinia理解【Vue3】

什么是Pinia Pinia是Vue的专属的最新状态管理库&#xff0c;是Vuex状态管理工具的替代品 优势&#xff1a; 提供了更加简单的API (去掉了mutation)提供符合组合式风格的API(和Vue3新语法统一)去掉了 modules 的概念&#xff0c;每一个 store 都是一个独立的模块搭配 TypeScr…

RabbitMQ Exchange类型和工作模式介绍

RabbitMQ Exchange类型和工作模式介绍 一RabbitMQ Exchange类型1.1.Fanout1.2.Direct1.3.Topic1.4.Headers 二 RabbitMQ 工作模式介绍2.1.work工作模式(资源的竞争)2.2.publish/subscribe发布订阅(共享资源)2.3.routing路由模式应用--direct交换器 2.4.topic 主题模式(路由模式…

一键轻松造数据:通过Postman实现表单提交

一、原始需求的诞生 在测试的过程中&#xff0c;需要大量的表单。于是我选择了通过postman发送表单提交的接口来造数据。 如上图所示&#xff0c;表单提交接口所需的参数以及请求体中需模拟的IP地址。参数为 {{}} 的表示需要不同的实参&#xff0c;至于原因就不在这里赘述了。如…

618手机大战:各大品牌花式秀战报,但难掩冷淡行情

在手机出货量持续下行的态势下&#xff0c;各大手机厂商普遍对618这个年中大促寄予厚望&#xff0c;希望通过各种促销手段&#xff0c;扭转销售颓势。 比如&#xff0c;今年5月下旬&#xff0c;小米、荣耀、OPPO、vivo等厂商就已经开启了降价、分期免息等优惠活动&#xff0c;…

Vue3自定义指令实现按钮权限

一、需求前提 登录成功后&#xff0c;后端直接返回了用户的所有权限&#xff08;路由权限按钮权限&#xff09;&#xff0c;在已经实现菜单权限的基础上&#xff0c;实现每个页面的按钮权限&#xff0c;树形数据结构如下&#xff1a; { "roles": ["admin&q…

嵌入式实时操作系统的设计与开发New(六)

aCoral的优先级与数字大小成反比&#xff0c;即&#xff1a;数字越大&#xff0c;优先级越低。 #define MAX_PRIO_NUM ((CFG_MAX_THREAD1) & 0xff) #define MINI_PRIO CFG_MAX_THREAD //最低优先级40typedef enum{ACORAL_INIT_PRIO; //init线程独有的0优先级ACORAL_MAX_PR…

如何刷新 DNS 缓存 (macOS, Linux, Windows)

如何刷新 DNS 缓存 (macOS, Linux, Windows) Unix Linux Windows 如何刷新 DNS 缓存 (macOS, FreeBSD, RHEL, CentOS, Debian, Ubuntu, Windows) 请访问原文链接&#xff1a;https://sysin.org/blog/how-to-flush-dns-cache/&#xff0c;查看最新版。原创作品&#xff0c;转载…

论文解读|基于平面双关节机器人的相机姿态分析与评估

原创 | 文 BFT机器人 01 研究内容 论文的主要研究内容是基于平面双关节机器人的相机姿态分析和评估。研究旨在分析相机的位置调整和一般数据分析&#xff0c;讨论人体姿势的平衡、关节运动的控制以及相机速率的估计和控制。 通过有限相机技术的应用&#xff0c;有效解决平面摄影…

【虚拟机数据恢复】XenServer虚拟机磁盘数据被破坏的数据恢复案例

虚拟机数据恢复环境&#xff1a; 一台某品牌720服务器&#xff0c;4块STAT硬盘通过RAID卡组建raid10磁盘阵列。部署的XenServer虚拟化平台Windows Server操作系统&#xff0c;共两个虚拟磁盘&#xff1a;数据盘系统盘。服务器作为Web服务器使用&#xff0c;上层部署ASP SQL Se…

Chrome插件开发_V3_浏览器扩展插件基础教程

文章目录 一、简介二、核心介绍三、自定义页面背景色三、设置页面背景图&#xff08;web_accessible_resources&#xff09;四、设置徽章&#xff08;Badge&#xff09;五、桌面通知六、消息通信七、自定义右键菜单&#xff08;添加、更新、删除&#xff09;八、Omnibox九、浏览…

JVM基础知识

JVM 一次编译终身运行1.1 JVM和java的体系结构1.1.1 虚拟机与JAVA虚拟机1.1.2 JVM的位置1.1.3 JVM的整体执行流程1.1.4 JAVA代码的执行流程1.1.5 JVM架构模型1.1.6 JVM的生命周期1.1.7 Sun Classic Vm1.1.8 Exact VM1.1.9 Hotspot VM1.1.10 BEA的JRockit1.1.11 IBM的 J91.1.12 …