第四章作业
一、选择题1,2,3,4,5
1.串是一种特殊的线性表,其特殊性体现在(B)
A.可以顺序存储
B.数据元素是一个字符
C.可以链式存储
D.数据元素可以是多个字
2.设有两个串p和q,求q在p中首次出现的位置的运算称为(B)
A.连接
B.模式匹配
C.求子串
D.求串长
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))的结果串是(D)
A.BCDEF
B.BCDEFG
C.BCPQRST
D.BCDEFEF
4.假设有60行70列的二维数组a[1…60,1…70]以列序为主序顺序存储,其基地址为10000,每个元素占两个存储单元,那么第32行第58列的元素a[32,58]的存储地址为(A),注意无第0行第0列的元素。
A.16902
B.16904
C.14454
D.答案A,B,C均不对
5.设矩阵A是一个对称矩阵,为了节省存储,将其下三角部分(如图)按行序存放在一维数组B[1,n(n-1)/2]中,
对下三角部分中的任一元素
a
i
,
j
a_{i,j}
ai,j(i<=j),在一维数组B中下标k值是(B)
A.i(i-1)/2+j-1
B.i(i-1)/2+j
C.i(i+1)/2+j-1
D.i(i+1)/2+j
二、填空题1,2,3,5,7,8
1.不包含任何字符(长度为0)的串称为(空串);由一个或多个空格(仅有空格符)组成的串称为(空白串)。
2.设s=“A;/document/Mary.doc”,则strlen(s)=(20)的“/”字符定位的位置为(3)
3.字串的定位运算称为串的模式匹配;被匹配的主串称为(被匹配的串),(子串)称为模式
5.设目标T=“abccdcdccbaa”,模式P=“cdcc”,则第(6)次匹配成功。
7.假设有二维数组A6X8,每个元素用相邻的6个字节存储,存储器按字节编址。已知A的起始存储位置(基地址)为1000,则数组A的体积(存储量)为(288B);末尾元素A57的第一个字节的地址为(1282);若按行存储,元素A14的第一个字节的地址为(1072);若按列存储,元素A47的第一个字节的地址为(1276)。
8.设数组a[1…60,1…70]的基地址为2048,每个元素占两个存储单元,若以列序为主序顺序存储,则元素a[32,58]的存储地址为(8950)
三、算法设计题3,5,7
3.编写基于SeqString类的成员函数reverse(),要求将当前对象中的字符反序存放
class SeqString:
def __init__(self, s):
self.str = s
def reverse(self):
# 使用切片来反转字符串
self.str = self.str[::-1]
def print(self):
print(self.str)
# 测试代码
s = SeqString("reverse 1999")
print("Original string:", end=" ")
s.print()
s.reverse()
print("Reversed string:", end=" ")
s.print()
5.编写基于SeqString类的成员函数stringcount(str),要求统计子串str在当前对象串中出现的次数,若不出现则返回0.
class SeqString:
def __init__(self, s):
self.str = s
def stringcount(self, sub_str):
count = 0
start_index = 0
while True:
# 在当前对象串中搜索子串
index = self.str.find(sub_str, start_index)
if index == -1:
break
count += 1
# 更新搜索的起始位置
start_index = index + 1
return count
# 测试代码
s = SeqString("reverse 1999:Can you can a can as a canner can can a can")
sub_str = "can"
print("Number of occurrences of '{}' in '{}': {}".format(sub_str, s.str, s.stringcount(sub_str)))
7.已知两个稀疏矩阵A和B,试基于三元组顺序表或十字链表的存储链表编程实现A+B的运算。
class MatrixNode:
def __init__(self, row, col, value):
self.row = row
self.col = col
self.value = value
self.right = None
self.down = None
class CrossLinkedList:
def __init__(self, row_num, col_num):
self.row_num = row_num
self.col_num = col_num
# 初始化行指针和列指针
self.row_heads = [None] * row_num
self.col_heads = [None] * col_num
def insert(self, row, col, value):
# 创建节点
node = MatrixNode(row, col, value)
# 插入节点到行链表
if self.row_heads[row] is None or self.row_heads[row].col > col:
node.right = self.row_heads[row]
self.row_heads[row] = node
else:
current = self.row_heads[row]
while current.right and current.right.col < col:
current = current.right
node.right = current.right
current.right = node
# 插入节点到列链表
if self.col_heads[col] is None or self.col_heads[col].row > row:
node.down = self.col_heads[col]
self.col_heads[col] = node
else:
current = self.col_heads[col]
while current.down and current.down.row < row:
current = current.down
node.down = current.down
current.down = node
def add(self, other):
if self.row_num != other.row_num or self.col_num != other.col_num:
raise ValueError("Matrix dimensions don't match")
result = CrossLinkedList(self.row_num, self.col_num)
for row in range(self.row_num):
for col in range(self.col_num):
value1 = self.get_value(row, col)
value2 = other.get_value(row, col)
result_value = value1 + value2
if result_value != 0:
result.insert(row, col, result_value)
return result
def get_value(self, row, col):
current = self.row_heads[row]
while current:
if current.col == col:
return current.value
elif current.col > col:
return 0
current = current.right
return 0
def print_matrix(self):
for row in range(self.row_num):
for col in range(self.col_num):
print(self.get_value(row, col), end=" ")
print()
# 测试代码
A = CrossLinkedList(3, 3)
A.insert(0, 0, 1)
A.insert(0, 2, 2)
A.insert(1, 0, 0)
A.insert(2, 0, 4)
print("矩阵A :")
A.print_matrix()
B = CrossLinkedList(3, 3)
B.insert(0, 1, 5)
B.insert(1, 0, 6)
B.insert(1, 1, 7)
B.insert(2, 2, 8)
print("矩阵B :")
B.print_matrix()
C = A.add(B)
print("A + B:")
C.print_matrix()