字串Word文档下载推荐.docx
《字串Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《字串Word文档下载推荐.docx(13页珍藏版)》请在冰豆网上搜索。
例如上例中的串a、b、c和d彼此都不相等。
值得一提的是,串值必须用一对单引号括起来,但单引号本身不属于串,它的作用只是为了避免与变量名或数的常量混淆而已。
例如在程序设计语言中
x='
123'
'
;
则表明x是一个串变量名,赋给它的值是字符序列123。
又如
tsing='
TSING'
中,tsing是一个串变量名,而字符序列TSING是其值。
在各种应用中,空格常常是串的字符集合中的一个元素,因而可以出现在其它字符中间。
由一个或多个空格组成的串'
'
称为空格串(blankstring,请注意:
此处不是空串)。
它的长度为串中空格字符的个数。
为了清楚起见,以后我们用符号"
0"
来表示"
空串"
。
串的逻辑结构和线性表极为相似,区别仅在于串的数据对象约束为字符集。
然而,串的基本操作和线性表有很大差别。
在线性表的基本操作中,大多以"
单个元素"
作为操作对象,如:
在线性表中查找某个元素、求取某个元素、在某个位置上插入一个元素和删除一个元素等;
而在串的基本操作中,通常以"
串的整体"
在串中查找某个子串、求取一个子串、在串的某个位置上插入一个子串以及删除一个子串等。
2串的抽象定义
串的抽象数据类型的定义如下:
基本操作:
StrAssign(&
T,chars)
初始条件:
chars是字符串常量。
操作结果:
生成一个其值等于chars的串T。
StrCopy(&
T,S)
串S存在。
由串S复制得串T。
StrEmpty(S)
若S为空串,则返回TRUE,否则返回FALSE。
StrCompare(S,T)
串S和T存在。
若S>
T,则返回值>
0;
若S=T,则返回值=0;
若S<
T,则返回值<
0.
StrLength(S)
返回S的元素个数,称为串的长度。
ClearSgring(&
S)
将S清为空串。
Contact(&
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相等的不重叠的子串。
Strlnsert(&
S,pos,T)
串S和T存在,l≤pos≤StrLength(S)+1。
在串S的第pos个字符之前插个串T.
StrDelete(&
S,pos,len)
:
串S存在,1≤pos≤StrLength(S)-len+1。
从串s中删除第pos个字符起长度为len的子串.
DestroyStrlng(&
串s存在。
串s被销毁。
}ADTString
对于串的基本操作集可以有不同的定义方法,读者在使用高级程序设计语言中的串类型时,应以该语言的参考手册为准。
在上述抽象数据类型定义的13种操作中,串赋值StrAssign、串比较StrCompare、求串长StrLength、串联接Concat以及求子串SubStrin8等五种操作构成串类型的最小操作子集。
即:
这些操作不可能利用其他串操作来实现,反之,其他串操作(除串清除C1earString和串销毁DestroyString外)均可在这个最小操作子集上实现。
.
例如,可利用判等、求串长和求子串等操作实现定位函数Index(S,T,pos)。
算法的基本思想为:
在主串S中取从第i(i的初值为pos)个字符起、长度和串T相等的于串和
串T比较,若相等,则求得函数值为i,否则i值增1直至串S中不存在和串T相等的子
串为止。
如算法1所示。
intlndex(StringS,StringT,intpos){
//T为非空串。
若主串s中第pos个字符之后存在与T相等的于串,
//则返回第一个这样的子串在s中的位置,否则返回0
if(pos>
0){
’
n=StrLength(S);
m=StrLength(T);
i=pos;
while(i<
=n-m+1){
SubString(sub,S,i,m);
if(StrCompare(sub,T)!
=0)
++i;
elsereturni;
//返回子串在主串中的位置
}//while
}//if
return0;
//S中不存在与T相等的子串
}//Index
算法1
3串操作应用举例
文本编辑
文本编辑程序是一个面向用户的系统服务程序,广泛用于源程序的输入和修改,甚至
用于报刊和书籍的编辑排版以及办公室的公文书信的起草和润色。
文本编辑的实质是修
改字符数据的形式或格式。
虽然各种文本编辑程序的功能强弱不同,但是其基本操作是
一致的,一般都包括串的查找,插入和删除等基本操作。
为了编辑的方便,用户可以利用换页符和换行符把文本划分为若干页,每页有若干行
(当然,也可不分页而把文件直接划成若干行)。
我们可以把文本看成是一个字符串,称为
文本串。
页则是文本串的子串,行又是页的子串。
比如有下列一段源程序
main(){
float
a,b,max;
scanf("
%f,%f"
&
a,&
b);
ifa>
bmax=a
elsemax=b;
我们可以把此程序看成是一个文本串.输入到内存后如图所示.图中"
/"
为换行符.
为了管理文本串的页和行,在进入文本编辑的时候,编辑程序先为文本串建立相应的
页表和行表,即建立各子串的存储映象。
页表的每一项给出了页号和该页的起始行号。
而行表的每一项则指示每一行的行号、起始地址和该行子串的长度。
假设图4.7所示文
本串只占一页,且起始行号为100,则该文本串的行表如图所示。
文本编辑程序中设立页指针、行指针和字符指针,分别指示当前操作的页、行和字符。
如果在某行内插入或删除若干字符,则要修改行表中该行的长度。
若该行的长度超出了
分配给它的存储空间,则要为该行重新分配存储空间,同时还要修改该行的起始位置。
如
果要插入或删除一行,就要涉及行表的插入或删除。
若被删除的行是所在页的起始行,则
还要修改页表中相应页的起始行号(修改为下一行的行号)。
为了查找方便,行表是按行
号递增顺序存储的,因此,对行表进行的插入或删除运算需移动操作位置以后的全部表
项。
页表的维护与行表类似,在此不再赘述。
由于访问是以页表和行表作为索引的,所以
在作行和页的删除操作时,可以只对行表和页表作相应的修改,不必删除所涉及的字符。
这可以节省不少时间。
/*========================================*/
/*
输入字串且将之印出
*/
#include<
stdio.h>
voidmain()
{
charstring[100];
/*字串阵列宣告
*/
charch;
/*输入字元
inti;
for(i=0;
i<
100;
i++)
/*清除字串阵列内容*/
string[i]='
putchar('
?
);
/*列出提示输入讯息*/
i=0;
while((ch=getchar())!
='
\n'
)
/*输入字元
{
string[i]=ch;
/*存入字串内
i++;
}
/*印出字串内容
putchar(string[i]);
/*换行
string[i]='
\0'
/*加结束字元
string[i]!
i++)
/*印出字串内容
使用字元阵列来储存格式字串
charformat[]={'
T'
'
h'
e'
s'
c'
o'
r'
i'
%'
d'
};
intscore;
/*成绩
score=100;
/*设定成绩内容*/
printf("
使用正常的格式化字符串\n"
/*印出结果
Thescoreis%d\n"
score);
使用字符数组的格式化字符串\n"
printf(format,score);
(插入影象16-5)
/*列出提示输入讯息
i=1;
/*从第二个元素开始
string[0]=i-1;
/*存入字串长度
for(i=1;
=string[0];
/*印出字串内容*/
/*----------------------------------------*/
计算字串长度
intstrlen(char*str)
str[i]!
i++);
/*用回路计算长度*/
returni;
主程式:
读入字串後,印出字串长度
/*字串阵列宣告
intlen;
/*字串长度
请输入字符串==>
"
gets(string);
/*读取字串
len=strlen(string);
/*计算字串长度
输入字符串长度是%d\n"
len);
(插入影象16-7)
字串拷贝
char*strcpy(char*str1,char*str2)
str2[i]!
i++)
str1[i]=str2[i];
/*拷贝字串内容*/
str1[i]='
/*设定字串结束*/
returnstr1;
读取字串後,将它做备份.
/*原始字串宣告*/
charbackup[100];
/*备份字串宣告*/
/*读取字串
strcpy(backup,string);
/*拷贝子字串
原始字符串%s\n"
string);
/*印出原始字串*/
备份字符串%s\n"
backup);
/*印出备份字串*/
结合两字串
char*strcat(char*str1,char*str2)
inti,j;
str1[i]!
i++);
/*找字串str1结束*/
for(j=0;
str2[j]!
j++)
/*拷贝字串内容
str1[i+j]=str2[j];
str1[i+j]='
/*设定字串结束
输入二字串後,将之结合成一字串.*/
charstring1[200];
/*字串阵列1宣告*/
charstring2[100];
/*字串阵列2宣告*/
请输入字符串
(1)==>
gets(string1);
/*读取字串1
请输入字符串
(2)==>
gets(string2);
/*读取字串2
strcat(string1,string2)