- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构
5
定长顺序存储表示的典型操作实现
❖ 串联接
Status Concat(SString &T, SString S1, SString S2) {
// 用T返回由S1和S2联接而成的新串。若未截断,则返回TRUE,否则FALSE。
if(S1[0]+S2[0] <= MAXSTRLEN) { // 未截断
数据结构
2
串的抽象数据类型定义
ADT Stack{
数据对象: D={ai| ai(- CharacterSet,i=1,2,...,n,n>=0} 数据关系: R1={<ai-1,ai>| ai-1,ai(- D,i=2,...,n} 基本操作:
StrAssign(&T,chars) chars是字符常量。生成一个其值等于chars的串T。
StrCopy(&T,S)
串S存在则由串S复制得串T
StrEmpty(S) 串S存在则若S为空串,返回真否则返回假
StrCompare(S,T)串S和T存在,若S>T,则返回值大于0,若S=T,则返回值=0,若S<T, 则返回值<0
StrLength(S) 串S存在返回S的元素个数称为串的长度.
ClearString(&S)
if (pos > 0) {
n = StrLength(S); m = StrLength(T); // 求得串长
-m+1) {
SubString(sub, S, i, m); // 取得从第 i 个字符起长度为 m 的子串
if(StrCompare(sub,T) != 0) ++i ;
for (i=1; i<=S1[0]; i++) T[i] = S1[i];
for (i=1; i<=S2[0]; i++) T[S1[0] + i] = S2[i];
T[0] = S1[0]+S2[0];
else return i ;
// 找到和 T 相等的子串
} // while
} // if
return 0;
// S 中不存在满足条件的子串
} // Index
数据结构
4
串的顺序表示和实现
❖ 串的顺序存储结构是用一组连续的存储单元依次存放串中的每个数据 元素。有两种实现方式:第一种是事先定义字符串的最大长度,字符 串存储在一个定长的存储区中,即静态数组表示法。第二种是在程序 执行过程中,利用标准函数malloc和free动态地分配或释放存储字符 串的存储单元它的好处在于:可以根据具体情况,灵活地申请适当数 目的存储空间,从而提高存储资源的利用率,即动态数组表示法(字符 指针)。
串S存在将S清为空串
Concat(&T,S1,S2) 串S1和S2存在用T返回由S1和S2联接而成的新串
SubString(&Sub,S,pos,len) 用Sub返回串S的第pos个字符起长度为len的子 串
Index(S,T,pos)
若主串S中存在和串T值相同的子串,则返回它在主串S中第
pos个字符之后第一次出现的位置,否则函数值为0
❖ 例如,可利用判等、求串长和求子串等操作实现串的定位函数 Index(S,T,pos) 和串的置换操作 Replace(S,T,V)。
❖ int Index(String S, String T, int pos) {
// 若主串S中第 pos 个字符之后存在与T相等的子串,则返回第一个这样的子串在S中的位置,否则返回0。
3
❖ 对于串的基本操作,许多高级语言均提供了相应的运算或标准库函数 来实现。在使用时,应以该语言的参考手册为准。但在上述抽象数据 类型定义的13种操作中,串赋值StrAssign、串复制StrCopy、串比 较StrCompare、求串长StrLength、串联接Concat以及求子串 SubString等6种操作构成串类型的最小操作子集。即这些操作不可 能利用其他串操作来实现,反之,其他串操作可在这个最小操作集上 实现。
❖ 静态数组表示(定长顺序存储表示) #define MAXSTRLEN 255 //用户可在255以内定义最大串长 typedef char SStrint[MAXSTRLEN + 1]; //0号单元存放串的长度
❖ 动态数组表示(堆分配存储表示) typedef struct{ char *ch; //若是非空串,则按串长分配存储区,否则ch为NULL int length; //串长度 }HString;
可以出现在其他字符之间。由一个或多个空格组成的串
称为空格串(blank string),例如“ ”,“ ”和
“ ”是三个空格串,它们的长度为串中空格字符的个
数,分别为1,3和5。为了清楚起见,我们将用符号
“Φ”表示“空串”。
数据结构
1
❖ 串中任意个连续的字符组成的子序列称为该串 的子串。包含子串的串相应地称为主串。通常 称字符在序列中的序号为该字符在串中的位置。 子串在主串中的位置则以子串的第一个字符在 主串中的位置来表示。
Replace(&S,T,V) 用V替换主串S中出现的所有与T相等的不重叠的子串
StrInsert(&S,pos,T) 在串S的第pos个字符之前插入串T
StrDelete(&S,pos,len)
从串中删除第pos个字符起长度为len的子串
DestroyString(&S) }ADT String
串S存在数,则据串结S被构销毁
串
❖ 串(String) :是一种特殊的线性表。其特殊性在于限 定了所有的数据元素必须都是字符。
❖ 假设串s=“a1a2a3…an”(n>=0),那么s是串的 名,用双引号括起来的字符序列是串的值;串中字符的 数目n称为串的长度。零个字符的串称为空串(null string),它的长度为零。
❖ 在各种应用中,空格通常是串的字符集合中的一个元素,
❖ 例:a='BEI',b='JING',c='BEIJING',d='BEI JING‘ 则串长分别为3,4,7,8,且a,b都是c,d的子串。
❖ 特别地,空串是任意串的子串,任意串是其自 身的子串。
❖ 称两个串是相等的,当且仅当这两个串的值相 等。即两个串的长度相等,并且各个对应位置 的字符也都相等时才相等。