1、习题四 ⒋1简述下列每对术语的区别: 空串和空格串;串变量和串常量;主串和子串;串名和串值 答: 空格串:由一个或多个空格组成的串称为空格串。 空串:不含任何字符的串,它的长度为0。 ⒋2对于字符串的每个基本运算,讨论是否可用其它基本运算构 4.3 设串s1='ABCDEFG',s2='PQRST',函数con(x,y)返回x和y串的连接串,subs(s,I,j)返回串s的从序号i的字符开始的j个字符组成的子串,len(s)返回串s的长度,则con(subs(s1,2,len(s2)),subs(s1,len(s2),2)))的结果串是什么 答:BCDE
2、FEF 4.4 设s='I AM A STUDENT', t='GOOD', q='WORKER'。 求:Len(s),Len(t),SubStr(s,8,7),SubStr(t,2,1),Index(s,'A'),Index(s,t),Replace(s,'STUDENT',q)和Concat(substr(s,6,2),Concat(t,substr(s,7,8)))。 答:len(s)=14;len(t)=4;substr(s,8,7)=‘STUDENT’; Substr(t,2,1)=‘o’;index(s,’A’)=3; index(s,t)=-1;
3、 Replace(s,'STUDENT',q)=‘I AM A WORKER’; Concat(substr(s,6,2),Concat(t,substr(s,7,8)))= ‘A GOOD STUDENT’ 4.5试问执行以下过程会产生怎样的输出结果? Demonstrate() { Assign(s,'THIS IS A BOOK'); Replace(s,SubStr(s,3,7),'ESE ARE'); Assign(t,Concat(s,'S')); Assign(u,'XYXYXYXYXYXY');
4、 Assign(v,SubStr(u,6,3)); Assign(w,'W'); printf('t=%s v=%s u=%s %s',t,v,u,replace(u,v,w)); }/*demonstrate*/ t=‘THESE ARE A BOOKS’ V=‘YXY’ U=‘XYXYXYXYXYXY’ XWXWXW 4.6已知:s='(XYZ)+*',t='(X+Z)*Y'。试利用联接、求子串和置换等运算,将s转化为t。 Status NiBoLan_to_BoLan(Stringtype str,Stringtype &
5、new)//把前缀表达式str转换为后缀式new { Initstack(s); //s的元素为Stringtype类型 for(i=1;i<=Strlen(str);i++) { r=SubString(str,i,1); if(r为字母) push(s,r); else { if(StackEmpty(s)) return ERROR; pop(s,a); if(StackEmpty(s)) return ERROR; pop(s,b); StrAssign(t
6、Concat(r,b)); StrAssign(c,Concat(t,a)); //把算符r,子前缀表达式a,b连接为新子前缀表达式c push(s,c); } }//for pop(s,new); if(!StackEmpty(s)) return ERROR; return OK; }//NiBoLan_to_BoLan 4.7设T[0..n-1]="adaabaabcaabaa",P[0..m-1]="aab".当用模式串匹配目标串T时,请给出所有的有效位移。 4.8写一算法void StrReplace(c
7、har *T, char *P, char *S),将T中首次出现的子串P替换为串S。注意:S和P的长度不一定相等。可以使用已有的串操作。 suan(slstrtype *x,slstrtype *y) { char *p,*q; char m; p=x; q=y; while(p!=NULL) { m=p->ch; while(q!=NULL) { if(m!=q->ch) return m; q=q->next; }
8、
p=p->next;
}
return -1; /*S中的字符在Y中都有*/
}
⒋9在串的顺序存储结构上实现串的比较运算StrCmp(S,T)。
int strcmp(a,b)
orderstring *a,*b;
{
int i,minlen;
if (a->len
9、
if (a->vec[i] 10、 /*s>t*/
}
4.10_若S和T是用结点大小为1的单链表存储的两个串,试设计一个算法找出S中第一个不在T中出现的字符
char findfirst(x,y)
linkstring *x,*y;
{
linkstring *p;
char c;
p=x;
if (x==NULL) printf("x 为空\n");
else
{
while (found(p->info,y)) p=p->link;
c=p->info;
} 11、
return(c);
}
/*函数 found()的功能是:若 head 的链表中包含有 data 域为 x 的*/
/*结点则返回 1;否则返回 0*/
int found(d,head)
linkstring *head;
char d;
{
while (head!=NULL && head->info!=d)
head=head->link;
if (head==NULL) return(0);
else return(1);
}
第四章上机内容
1, 设计一个算法将串中所有的字符倒过 12、来重新排列。
dao(slstrtype *p)
{
slstrtype *m,*n;
char a[50]; /*最大字符数*/
int top=0;
m=p;n=p;
while(m!=NULL)
{
a[top++]=m->ch;
m=m->next;
}
while(top>=0)
{
n->ch=a[--top];
n=n->next;
}
return p;
13、 }
2、采用顺序结构存储串,编写一个函数index(s1,s2),用于判断s2是否是s1的子串。若是,返回其在主串中的位置;否则返回-1。
提示:设s1=“a1a2…am” ; s2=“b1b2…bn” 从s1中找出与b1匹配的字符ai,若ai=b1,则判断是否ai+1=b2,…,ai+n-1=bn,若都相等,s2为s1的子串,否则继续比较ai之后的字符。
#define N 20
int substring (s1,s2)
orderstring *s1,*s2;
{
int i,j,k,yes=0;
i=0;
while (i 14、>len && !yes)
{
j=0;
if (s1->vec[i]==s2->vec[j])
{
k=i+1;
j++;
while (s1->vec[k]==s2->vec[j])
{
k++;
j++;
}
if (j==s2->len) yes=1;
else i++;
}
else i++;
}
retur 15、n(yes);
}
3、利用串的基本运算,编写一个算法删除串s1中所有s2子串。
提示:本题利用2题的index()函数和删除子串函数循环实现。
#define N 20
#include 16、 break;
if(*(s2+j)=='\0') x=i+1;
}
}
return(x);
}
void del(char *s1,char *s2)
{
int i,j;
while(index(s1,s2)!=-1)
{
i=index(s1,s2);
for(j=0;j<=strlen(s2);j++)
{
s1[i-1]=s1[i+strlen(s2)-1];
i++;
}
}
}
main()
{
char s1[N],s2[N];
17、 printf("input the string s1:\n");
scanf("%s",s1);
printf("input the string s2:\n");
scanf("%s",s2);
while(index(s1,s2)!=-1)
{
printf("the positon of s2 is %d.\n",index(s1,s2));
del(s1,s2);
}
printf("the result is:\n%s",s1);
getch();
}






