数据结构习题( 5

 
 
 

5 - 1 字符串的替换操作 replace (String & s, String & t, String & v) 是指:若 t 是 s 的子串,则用串 v 替换串 t 在串 s 中的所有出现;若 t 不是 s 的子串,则串 s 不变。例如,若串 s 为 “aabbabcbaabaaacbab” ,串 t 为 “bab” ,串 v 为 “abdc” ,则执行 replace 操作后,串 s 中的结果为 “aababdccbaabaaacabdc” 。试利用字符串的基本运算实现这个替换操作。 要求算法填空。

【解答】

String & String :: Replace ( String & t , String & v) {

if ( ( int id = Find ( t ) ) == - 1 ) // 没有找到,当前字符串不改,返回

{ cout << "The (replace) operation failed." << endl; return *this; }

String temp( ch ) ; // 用当前串建立一个空的临时字符串

ch[0] = '\0' ; curLen = 0 ; // 当前串作为结果串,初始为空

int j, k = 0, l ; // 存放结果串的指针

while ( ------------ ) {

for ( j = 0 ; j < id ; j++) ch[k++] = temp.ch[j] ; // 摘取 temp.ch 中匹配位置

if ( ------------------------------------- )

l = v.curLen ; // 确定替换串 v 传送字符数 l

else l = maxLen - curLen - id ;

for ( j = 0 ; j < l ; j++ ) --------------------------- = v.ch[j] ; // 连接替换串 v 到结果串 ch 后面

curLen += id + l ; // 修改结果串连接后的长度

if ( curLen == maxLen ) break; // 字符串超出范围

for ( j = id + t.curLen ; ----------------------- ; j++ )

temp.ch[j - id - t.curLen] = temp.ch[j] ; // 删改原来的字符串

temp.curLen - = id + t.curLen ;

id = temp.Find ( t ) ;

}

return *this;

}

 

5 -2 编写一个算法 frequency ,统计在一个输入字符串中各个不同字符出现的频度。用适当的测试数据来验证这个算法。

【 解答 】

include <iostream.h>

include "string.h"

void frequency( String & s, char& A[ ] , int& C[ ] , int & k ) {

// s 是输入字符串,数组 A[ ] 中记录字符串中有多少种不同的字符, C[ ] 中记录每

// 一种字符的出现次数。这两个数组都应在调用程序中定义。 k 返回不同字符数。

int i, j, len = s.length( ) ;

 

测试数据 s = "cast cast sat at a tasa\0"

测试结果:

A

c

a

s

t

b

C

2

7

4

5

5

【另一 解答 】

include <iostream.h>

include "string.h"

const int charnumber = 128; /*ASCII 码字符集的大小 */

void frequency( String & s , int& C[ ] ) {

// s 是输入字符串,数组 C[ ] 中记录每一种字符的出现次数。 

5 -3 设串 s 为 “aaab” ,串 t 为 “abcabaa” ,串 r 为 “abc  aabbabcabaacbacba” ,试分别计算它们的失效函数 f (j) 的值。

【 解答 】

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

答案

>>返回