串的定义

串(string)是由零个或多个字符组成的有限序列,又名叫字符串。

一般记为 s = “  ”(n≥0),其中,s 是串的名称,用双引号括起来的字符序列是串的值。

串中的字符数目n称为串的长度。零个字符的串称为空串(null string)。它的长度为零,可以直接用两个双引号表示,也可以用希腊字母“φ‘’表示。

空格串:是只包含空格的串,空格串是有长度的,而且可以不止一个空格。

子串:串中任意个数的连续字符组成的子序列称为该串的子串。

主串:包含子串的串称为主串。

串的比较

事实上,串的比较是通过组成串的字符之间的编码来进行的,而字符的编码指的是字符在对应字符集中的序号。

在c语言中,判断两个串是否相等:必须是它们串的长度以及它们各个对应位置的字符都相等,才算是相等。

对于两个不相等的串,s = “”,t = “”,当满足以下条件之一时,s < t 。

1. n < m , 且 (i = 1,2,3, ......, n)。

例如,s = “lo”,t = “love”,就有s < t ,因为 t 比 s 多了两个字母。

2. 存在某个 k ≤ min(m,n),使得  (i = 1,2,3,......,k - 1),

例如,当 s = “happen”,t = “happy”,因为两串的前4个字母相同,而第5个字母,字母 e 的 ASCII 码是101,而字母 y 的 ASCII 码是121,显然 e < y,所以 s< t 。

串的抽象数据类型

ADT 串 (String)Data串中的元素仅由一个字符组成,相邻元素具有前驱和后继关系.Operation
StrAssign (&T, chars)初始条件:chars是字符串常量。操作结果:生成一个其值等于chars的串T。
StrCopy (&T, S)初始条件:串S存在。操作结果:由串S复制得串T。
StrEmpty(S)初始条件:串S存在。操作结果:若S为空串,则返回TRUE,否则返回FALSE。
StrCompare(S, T)初始条件:串S和T存在。操作结果:若S>T,则返回值>0;若S=T,则返回值=0;若S < T,则返回值 < 0。
StrLength(S)初始条件:串S存在。操作结果:返回S的元素个数,称为串的长度。
ClearString (&S)初始条件:串S存在。操作结果:将S清为空串。
Concat (&T, S1, S2)初始条件:串S1和S2存在。操作结果:用T返回由S1和S2联接而成的新串。
SubString(&Sub, S, pos, len)初始条件:串S存在,1≤pos≤StrLength(S)且0≤len≤StrLength(S)-pos+1操作结果:用Sub返回串S的第pos个字符长度为len的子串。
Index(S, T, pos)初始条件:串S和T存在,T是非空串,1≤pos≤StrLength(S)。操作结果:若主串S中存在和串T值相同的子串,则返回它在主串S中第pos个字符之后第一次出现的位置;否则函数值为0。
Replace (&S, T, V)初始条件:串S, T和V存在,T是非空串。操作结果:用V替换主串S中出现的所有与T相等的不重叠的子串。
StrInsert (&S, pos, T)初始条件:串S和T存在, 1≤pos≤StrLength(S)+1。操作结果:在串S的第pos个字符之前插入串T。
StrDelete (&S, pos, len)初始条件:串S存在, 1≤pos≤StrLength(S)-len+1。操作结果:从串S中删除第pos个字符起长度为len的子串。
DestroyString (&S)初始条件:串S存在。操作结果:串S被销毁。endADT

串的基本运算

对于串的基本操作,与线性表还是很有差别的,线性表关注的是单个元素的操作,比如查找一个元素,插入或是删除一个元素,但串中更多的是查找子串的位置、得到指定位置子串、替换子串等操作。

求串长:StrLength(s);
串赋值:StrAssign(s1,s2);    // 将s2的串值赋予s1
连接运算:StrConcat(s1,s2,s) 或 StrConcat(s1,s2).//在s1后面连接s2的串值,产生新串s
求子串:SubStr(s,i,len);//返回s的第i至len个字符的子串值。len=0为空串。例如:SubStr("abcdefg",2,3) = "bcd"
串比较:StrComp(s1,s2);//若s1 =s2 ,操作返回值为0;s1<s2,返回值<0;反之>0
串定位:StrIndex(s,t);//若t被包含于s中,则返回值为t的位置,反之值为-1
串插入:StrInsert(s,i,t);//将串t插入到s的第i个字符位置上
串删除:StrDelete(s,i,len);//删除串t中第i至len个字符的子串
串修改:StrRep(s,t,r);//用串r替换s中出现的所有与串t相等且不重叠的子串

串的表示方法

串有3种机内的表示方法

1.定长顺序存储表示

类似于线性表中的顺序存储结构,是用一组地址连续的存储单元来存储串中的字符序列的。按照预定义的大小,为每个定义的串变量分配一个固定长度的存储区。

串连接:把两个串s1和s2首尾连接成一个新串s,即s<-s1+s2

int StrConcat(s1,s2,s)char s1[],s2[],s[];//将串s1,s2合并到串s,合并成功返回1,否则返回0
{int i =0,j,len1,len2;len1 = StrLength(s1);len2 = StrLength(s2);if(len1+len2>MAXSIZE-1) return 0;    //s 长度不够j = 0 ;while(s1[j]! ="\0"){s[i] = s1[j];i++;j++;}while(s2[j]! ="\0"){s[i] = s2[j];i++;j++;}s[i] = "\0";return 1;
}

求子串:

int StrSub(char *t ,char *s,int i , in len){
//用t返回串s中第i个字符串开始的长度为len的子串,1<=i串长int slen;slen = StrLength(s);if(i<1 || i>slen || len<0 || len>slen-i+1){return 0;}for(j =0 ; j<len ; j++){t[j] =s[i+j-1];t[j] ="\0";return 1;}
}

2.堆分配存储表示

在顺序串上的插入、删除操作并不方便,必须移动大量的字符,而且当操作中出现串值序列的长度超过上界MAXSIZE时,只能用截尾法处理。要克服这个弊病,只有不限定串的最大长度,动态分配串值的存储空间。

堆分配存储结构的特点是:仍以一组地址连续的存储单元存放串的字符序列,但其存储空间是在算法执行过程中动态分配得到的。在C语言中,由动态分配函数malloc()和free()来管理。利用函数malloc()为每一个新产生的串分配一块实际需要的存储空间,若分配成功,则返回一个指针,指向串的起始地址。

由于堆分配存储结构的串既有顺序存储结构的特点,在操作中又没有串长的限制,显得很灵活,因此,在串处理的应用程序中常被选用。

3.串的块链存储表示

串的链式存储与线性表相似,但由于串结构的特殊性,结构中的每个元素数据都是一个字符,如果也简单的应用链表存储串值,一个结点对应一个字符,就会存在很大的空间浪费,因此一个结点可以存放多个字符,最后一个结点若是未被占满时,可以用 "#" 或其它非串值字符补全。

为了便于进行串的操作,当以链表存储串值时,除头指针外还可附设一个尾指针指示链表中的最后一个结点,并给出当前串的长度。称如此定义的串存储结构为块链结构。

数据结构-线性表-串相关推荐

  1. 数据结构-线性表之用队列实现栈用栈实现队列

    文章目录 **********用队列实现栈 一:思路 二:实现 (1)结构体定义 (2)初始化和销毁 (3)进"栈" (4)出"栈" 三:代码 ******** ...

  2. 数据结构-线性表之带头结点的双向循环链表

    文章目录 前言 实现 (1)结构定义 (2)基本函数 (3)操作实现 测试 代码 前言 链表的类型有很多种(根据带头或不带头,循环或非循环等等),但是我们重点研究的只有两种,一种结构非常简单是无头单向 ...

  3. 数据结构摧毁线性表用c语言,[简述]数据结构-线性表(c语言实现)

    [简述]数据结构-线性表(c语言实现)second60 20180422 1. 线性表的定义 线性表是具有相同特性的数据元素的一个有限序列. 2. 线性表抽象数据类型描述 ADT  List { 数据 ...

  4. 王道数据结构线性表:有读者认为直接去掉p结点会造成断链?

    王道数据结构线性表:有读者认为直接去掉p结点会造成断链? 我用图解的方式来说明一下,文字有点多,看起来比较眼疼,但是内容不多,希望能对你有帮助. 书上的代码 解释 (ps:对上面解释的一点补充↓)

  5. 数据结构——线性表(三)

    数据结构--线性表(三) 作者:黑衣侠客 一.线性表的定义 线性表,从名字来看,可以发现,是具有像线一样性质的表 线性表:零个或多个数据元素的有限序列. 首先,它是一个序列,也就是说,元素之间是有顺序 ...

  6. 数据结构-线性表(严书代码实现)

    数据结构-线性表的顺序表示代码 //头文件内容实现 #ifndef SEQLIST_H_INCLUDED #define SEQLIST_H_INCLUDED #include<string.h ...

  7. 数据结构-线性表-思维导图+小结

    数据结构-线性表思维导图+小结 1 数据结构-第二章-线性表-思维导图 2 数据结构-第二章-线性表-习题小结 2.1 概念性习题小结 2.2 操作性习题小结 1 数据结构-第二章-线性表-思维导图 ...

  8. 数据结构线性表基本操作

    数据结构线性表基本操作 基本内容 线性表的顺序表示和实现 线性表的顺序存储表示 顺序表中基本操作的实现 1.顺序表的初始化 2.取值 3.查找 4.插入 5.删除 线性表的链式表示和实现 单链表的定义 ...

  9. c语言构造一个空线性表l,数据结构线性表顺序结构的定义与实现C语言-Go语言中文社区...

    大家好,今天给大家总结了一下数据结构里面的线性表的顺序结构,顺序表表示的是用一组地址连续的存储单元依次存储线性表的数据元素,所以顺序结构的实现一般采用数组的方式来实现,存储空间也采用动态分配的方式.在 ...

最新文章

  1. LeetCode简单题之有序数组中出现次数超过25%的元素
  2. 将TensorFlow模型变为pb——官方本身提供API,直接调用即可
  3. Django 学习第十一天——中间键和上下文处理器
  4. Unity3D图形性能优化
  5. python实战,教你用微信每天给女朋友说晚安
  6. POJ 1028 浏览器前进后退(双栈)
  7. 边缘计算助力云游戏成为5G时代的杀手级应用
  8. 解决MSChart底部横坐标显示不全的问题
  9. 【算法设计】最大子段和问题解析(对应算法第三题)
  10. (原创)无废话C#设计模式之二十:Mediator
  11. 【渝粤教育】广东开放大学 开放教育 学生创业案例 形成性考核 (59)
  12. QT实现图片缩放的同时标记指定坐标
  13. 2021年制冷与空调设备运行操作考试题及制冷与空调设备运行操作证考试
  14. 楚留香冰最新服务器,一梦江湖:各门派冰雪外观极寒之刃上线,冰晶透亮玩家直呼绝了!...
  15. [转][TFS] 禁止默认允许多人签出和强制解除签入签出锁
  16. linux 按键检测 防抖,GPIO输入——按键检测
  17. polsarpro滤波后没有bmp文件_win10系统右键新建菜单中没有bmp如何解决
  18. UE4 Pak文件操作
  19. 公交车信息查询管理系统(Java实现)
  20. 夜半加班之附魔吃药篇!

热门文章

  1. Ubuntu20.04 安装ch340驱动
  2. Python项目实战:Python版超市管理系统源代码
  3. openlayers3.20.1发布说明
  4. Mybatis java.lang.ExceptionInInitializerError at xxx.test (已解决)
  5. Unity调用Face++ 人脸识别 Detect API
  6. 【2023考研数学】学习规划
  7. matlab晶闸管整流电路,什么是单相桥式整流电路?单相桥式整流在MATLAB仿真波形图,以及原理分析...
  8. ERP主要功能模块简介- -
  9. 如何用JavaScripte和HTML 实现一整套的考试答题卡和成绩表
  10. 谷歌首提Android11,谷歌首提Android11,即将发布的Pixel 4会搭载?传统强项再突破...