数据结构(四)——串的定义和基本操作

四、串

4.1 串的定义和实现

4.1.2 串的定义

  • 串:即字符串(String)是由零个或多个字符组成的有限序列。
    例:T=‘iPhone 11 Pro Max?’
  • 子串:串中任意个连续的字符组成的子序列。                 Eg:’iPhone’,’Pro M’ 是串T 的子串
  • 主串:包含子串的串。                                                       Eg:T 是子串’iPhone’的主串
  • 字符在主串中的位置:字符在串中的序号。                     Eg:’1’在T中的位置是8(第一次出现)
  • 子串在主串中的位置:子串的第一个字符在主串中的位置 Eg:’11 Pro’在 T 中的位置为8
    注意:串的位序是从1开始而不是从0开始
  • 空串:M=‘’  M是空串,里面没有存任何东西
  • 空格串:N=‘   ’ N是由三个空格字符组成的空格串,每个空格字符占1B

串是一种特殊的线性表,数据元素之间呈线性关系

串的数据对象限定为字符集(如中文字符、英文字符、数字字符、标点字符等)

4.1.3 串的基本操作

  • StrAssign(&T,chars):赋值操作。把串T赋值为chars。
  • StrCopy(&T,S):复制操作。由串S复制得到串T。
  • StrEmpty(S):判空操作。若S为空串,则返回TRUE,否则返回FALSE。
  • StrLength(S):求串长。返回串S的元素个数。
  • ClearString(&S):清空操作。将S清为空串。
  • DestroyString(&S):销毁串。将串S销毁(回收存储空间)。
  • Concat(&T,S1,S2):串联接。用T返回由S1和S2联接而成的新串
  • SubString(&Sub,S,pos,len):求子串。用Sub返回串S的第pos个字符起长度为len的子串。 Index(S,T):定位操作。若主串S中存在与串T值相同的子串,则返回它在主串S中第一次出现的 位置;否则函数值为0。
  • StrCompare(S,T):比较操作。若S>T,则返回值>0;若S=T,则返回值=0;若S<T,则返回值<0

4.2 串的存储结构

4.2.1 串的顺序存储

串的顺序存储(静态数组):

// ch[0]废弃不用,声明int型变量length来存放串的长度
#define MAXLEN 255    //预定义最大串长为255typedef struct{        char ch[MAXLEN];  //每个分量存储一个字符 静态数组实现(定长顺序存储)int length;       //串的实际长度
}SString;// 串的初始化
bool InitString(SString &S){S.length = 0;    return true;
}// 求串的长度
int StrLength(SString S){    return S.length;
}// 求子串
bool SubString(SString &Sub, SString S, int pos, int len){ if(pos+len-1 > S.length)            //子串范围越界return false;    for(int i=pos; i<pos+len; i++)Sub.ch[i-pos+1] = S.ch[i];Sub.length = len;return true;
}// 比较操作。笔记S、T的大小,若S>T,则返回值大于0;若S=T,则返回值等于0;若S<T,则返回值小于0
int StrCompare(SString S, SString T){    for(int i=1; i<=S.length && i<=T.length; i++){if(S.ch[i]!=T.ch[i])       return S.ch[i]-T.ch[i];    }    // 扫描过的所有字符都相同,则长度长的串更大    return S.length-T.length;
}//定位操作。主串S中存在与串T值相同的子串则返回串T在主串S中第一次出现的位置,若无法定位则返回0
int Index(SString S, SString T){    int i=1, n=StrLength(S), m=StrLength(T);    //n求出S的长度,m表示T的长度SString sub;   //用于暂存子串while(i<=n-m+1){       //从头到尾依次取     SubString(sub, S, i, m);        if(StrCompare(sub, T)!=0)            ++i;        else            return i;    //返回子串在主串中的位置}return 0;	//S中不存在与T相等的子串
}void test{    SString S;    InitString(S);    ...
}

串的顺序存储(动态数组):

#define MAXLEN 255typedef struct{  char *ch;        //按串长分配存储区,ch指向串的基地址int length;
}HString;            //动态数组实现(堆分配存储)bool InitString(HString &S){ S.ch = (char *)malloc(MAXLEN * sizeof(char)); //malloc分配一片连续的存储空间if(S.ch == NULL)      return false;  S.length = 0;  return true;
}void test{  HString S;  InitString(S);  ...
}

4.2.2 串的链式存储

typedef struct StringNode{   char ch;	//每个结点存1个字符  struct StringNode *next;
}StringNode, *String;

上述方式存储密度低, 一般采用下面的方式,使每个结点存储多个字符

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

4.2.3 基本操作的实现



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

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

相关文章

蓝桥杯每日一题:血色先锋队

今天浅浅复习巩固一下bfs 答案&#xff1a; #include<iostream> #include<algorithm> #include<cstring>using namespace std; typedef pair<int,int> PII;const int N510; int n,m,a,b; int dist[N][N]; PII q[N*N]; int hh0,tt-1;int dx[]{1,0,-1,…

通信系统架构

本博客地址&#xff1a;https://security.blog.csdn.net/article/details/136785570 一. 通信系统架构基础 1、通信网络主要形式&#xff1a;局域网、广域网、移动通信网。 二. 局域网 2、局域网网络架构通常由计算机、交换机、路由器等设备组成。特点是覆盖地理范围小、数…

【医学图像处理】ECAT和HRRT格式转nii格式【超简单】

之前从ADNI上下载PET数据的时候发现有许多数据的格式不是DICOM的而是ECAT或者是HRRT格式&#xff0c;这对原本就少的PET数据是血上加霜啊。 当然只使用DICOM格式的数据也会得到不少的数据&#xff0c;我一开始也是只使用DICOM格式的样本&#xff0c;后来为了得到更多的数据&a…

【LabVIEW FPGA入门】浮点数类型支持

如今&#xff0c;使用浮点运算来设计嵌入式系统的需求变得越来越普遍。随着 FPGA 因其固有的大规模并行性而在浮点性能方面继续超越微处理器&#xff0c;这种情况正在加剧。线性代数和数字信号处理 (DSP) 等高级算法可以受益于浮点数据类型的高动态范围精度。LabVIEW FPGA 通过…

力扣hot100:33. 搜索旋转排序数组(二分的理解)

33.搜索旋转排序数组 ​ 这是一个非常有趣的问题&#xff0c;如果不要求使用O(logn)应该没人会想到吧。。 方法一&#xff1a; 极致的分类讨论。旋转排序数组&#xff0c;无非就是右边的增区间的数小于左边的增区间的数&#xff0c;然后依次排序。因此我们只需要分三类讨论即可…

CMAKE_CUDA_ARCHITECTURES set to ‘native’多版本与版本号矛盾问题,报错

CMAKE_CUDA_ARCHITECTURES set to ‘native’多版本与版本号矛盾问题&#xff0c;报错 1. 报错提醒如下图2. 原因本地安装多个cuda版本导致native寻找到多个版本&#xff0c;导致报错3. 具体配置需要根据你的显卡型号来确认 1. 报错提醒如下图 2. 原因本地安装多个cuda版本导致…

单元测试、集成测试、系统测试区别

一、测方法不同 1、单元测试属于白盒测试范畴。 2、集成测试属于灰盒测试范畴。 3、系统测试属于黑盒测试范畴。 二、考察范围不同 1、单元测试主要测试单元内部的数据结构、逻辑控制、异常处理等。exception handling 2、集成测试主要测试模块之间的接口和接ロ数据传递关…

【prometheus】k8s集群部署prometheus server(文末送书)

目录 一、概述 1.1 prometheus简介 1.2 prometheus架构图 1.3测试环境 二、k8s集群中部署prometheus server 2.1创建sa账号和数据目录 2.2安装prometheus 2.2.1创建configmap存储卷存放prometheus配置信息 2.2.2 通过deployment部署prometheus 2.2.3prometheus pod创…

网络安全主题

网络安全主题 Python信息安全库之fsociety使用详解 https://blog.csdn.net/Rocky006/article/details/136040500 VULNCMS靶机 https://blog.csdn.net/m0_66299232/article/details/128780619 渗透测试框架-Fsociety https://blog.csdn.net/andiao1218/article/details/10119…

ConsiStory:Training-Free的主体一致性生成

Overview 一、总览二、PPT详解 ConsiStory 一、总览 题目&#xff1a; Training-Free Consistent Text-to-Image Generation 机构&#xff1a;NVIDIA, Tel-Aviv University 论文&#xff1a;https://arxiv.org/pdf/2402.03286.pdf 代码&#xff1a;https://consistory-paper.g…

zookeeper快速入门三:zookeeper的基本操作

在zookeeper的bin目录下&#xff0c;输入./zkServer.sh start和./zkCli.sh启动服务端和客户端&#xff0c;然后我们就可以进行zookeeper的基本操作了。如果是windows&#xff0c;请参考前面章节zookeeper快速入门一&#xff1a;zookeeper安装与启动 目录 一、节点的增删改查 …

异常GPT:使用LVLMs检测工业异常

AnomalyGPT&#xff1a;利用LVLMs进行工业异常检测 摘要 本文介绍了一种名为AnomalyGPT的新型工业异常检测方法&#xff0c;该方法基于大型视觉语言模型(LVLMs)。AnomalyGPT能够检测并定位图像中的异常&#xff0c;无需手动设置阈值。此外&#xff0c;AnomalyGPT还可以提供与…

【Java基础知识总结 | 第三篇】深入理解分析ArrayList源码

文章目录 3.深入理解分析ArrayList源码3.1ArrayList简介3.2ArrayLisy和Vector的区别&#xff1f;3.3ArrayList核心源码解读3.3.1ArrayList存储机制&#xff08;1&#xff09;构造函数&#xff08;2&#xff09;add()方法&#xff08;3&#xff09;新增元素大体流程 3.3.2ArrayL…

react03

react03 修改脚手架创建的打包命令 根据scripts中的命令&#xff0c;执行npm run eject ,输入y, 如果对原始的脚手架文件有过改动需要进行将修改后的文件提交到git 历史区 &#xff0c;防止暴露后的代码覆盖我们自己的文件 git 提交&#xff1a; git add . git commit -m ‘…

java----网络编程(一)

一.什么是网络编程 用户在浏览器中&#xff0c;打开在线视频网站&#xff0c;如优酷看视频&#xff0c;实质是通过网络&#xff0c;获取到网络上的一个视频资源。 与本地打开视频文件类似&#xff0c;只是视频文件这个资源的来源是网络。所谓网络资源就是网络中获取数据。而所…

基于Python的股票市场分析:趋势预测与策略制定

一、引言 股票市场作为投资领域的重要组成部分&#xff0c;其价格波动和趋势变化一直是投资者关注的焦点。准确预测股票市场的趋势对于制定有效的投资策略至关重要。本文将使用Python编程语言&#xff0c;结合时间序列分析和机器学习算法&#xff0c;对股票市场的历史数据进行…

解决Ubuntu(20.04)和Windows11双系统时间不同步问题time for ubuntu and windows

Resolve the time synchronization issue between Ubuntu (20.04) and Windows 11 dual systems 解决Ubuntu(20.04)和Windows11双系统时间不同步问题 reference sudo apt-get install ntpdate sudo ntpdate time.windows.comsudo hwclock --localtime --systohc

晶体管-二极管三极管MOS管选型参数总结

🏡《总目录》 目录 1,概述2,二极管选型参数2.1,类型(Type)2.2,最大整流电流(IF)2.3,反向击穿电压(VRRM)2.4,正向压降(VF)2.5,反向电流(IR)2.6,结温(Tj)2.7,热阻(Rth)2.8,频率特性2.9,包装类型

python提取身份证中的生日和性别

1.代码 def sfzAnalysis(idNum):#检查身份证长度是否正确if len(idNum)!18:raise ValueError("身份证号码长度不正确&#xff0c;请输入一个18位的身份证号码。")#raise关键字在Python中有多种用途&#xff0c;主要涉及异常的抛出和错误处理#提取出生日期year idN…

LabVIEW提升舱救援通讯监测系统

LabVIEW提升舱救援通讯监测系统 随着科技的进步&#xff0c;煤矿救援工作面临着许多新的挑战。为了提高救援效率和安全性&#xff0c;设计并实现了一套基于LabVIEW的提升舱救援通讯监测系统。该系统能够实时监控提升舱内的环境参数和视频图像&#xff0c;确保救援人员和被困人…