class SqString: #顺序串类 def __init__(self): #构造方法 self.data=[None]*MaxSize #存放串中字符 self.size=0 #串中字符个数 #串的基本运算算法 def StrAssign(self,cstr): #创建一个串 for i in range(len(cstr)): self.data[i]=cstr[i] self.size=len(cstr) def StrCopy(self): #串复制 s=SqString() for i in range(self.size): s.data[i]=self.data[i] s.size=self.size return s def getsize(self): #求串长 return self.size def __getitem__(self,i): #求序号为i的元素 assert 0<=i<self.size #检测参数i正确性的断言 return self.data[i] def __setitem__(self,i,x): #设置序号为i的元素 assert 0<=i<self.size #检测参数 self.data[i]=x def Concat(self,t): #串连接 s=SqString() #新建一个空串 s.size=self.size+t.getsize() for i in range(self.size): #将当前串data[0..str.size-1]->s s.data[i]=self.data[i] for i in range(t.getsize()): #将t.data[0..t.size-1]->s s.data[self.size+i]=t.data[i] return s #返回新串s def SubStr(self,i,j): #求子串
时间: 2024-01-24 17:04:55 浏览: 113
def SubStr(self,i,j):
assert i >= 0 and j >= 0 and i+j <= self.size, "Index out of range" # 检测参数i, j的正确性
s = SqString() # 创建一个新串
s.size = j # 设置新串的长度为j
for k in range(j): # 将当前串中的第i到第i+j-1个字符复制到新串中
s.data[k] = self.data[i+k]
return s # 返回新串
相关问题
修改以下代码:MaxSize=5 #全局变量,假设容量为5 class LinkNode: #链队结点类 def __init__(self,data=None): #构造方法 self.data=[None] *MaxSize #data属性 self.next=None #next属性 class LinkQueue: #链队类 def __init__(self): #构造方法 self.front=None #队头指针 self.rear=None #队尾指针 def empty(self): # 判断队是否为空 return self.front == self.rear def push(self, e): # 元素e进队 s = LinkNode(e) # 新建结点s if self.empty(): # 原链队为空 self.front = self.rear = s else: # 原链队不空 self.rear.next = s # 将s结点链接到rear结点后面 self.rear = s def pop(self): # 出队操作 assert not self.empty() # 检测空链队 if self.front == self.rear: # 原链队只有一个结点 e = self.front.data # 取首结点值 self.front = self.rear = None # 置为空队 else: # 原链队有多个结点 e = self.front.data # 取首结点值 self.front = self.front.next # front指向下一个结点 return e def gethead(self): # 取队头元素 assert not self.empty() # 检测空链队 e = self.front.data # 取首结点值 return e def size(self): # 返回队中元素个数 return ((self.rear - self.front + MaxSize) % MaxSize) #主程序 if __name__ == '__main__': t=LinkQueue() t.push(4) t.push(6) t.push(1) t.push(9) print(" 队列元素个数:%d" % (t.size())) print() print("队头元素: %d" % (t.gethead())) print(" 出队元素:%d" % (t.pop())) print(" 队列元素个数:%d" % (t.size())) print()
MaxSize=5 #全局变量,假设容量为5
class LinkNode: #链队结点类
def __init__(self,data=None): #构造方法
self.data=data #data属性
self.next=None #next属性
class LinkQueue: #链队类
def __init__(self): #构造方法
self.front=None #队头指针
self.rear=None #队尾指针
def empty(self): # 判断队是否为空
return self.front == None and self.rear == None
def push(self, e): # 元素e进队
s = LinkNode(e) # 新建结点s
if self.empty(): # 原链队为空
self.front = self.rear = s
else: # 原链队不空
self.rear.next = s # 将s结点链接到rear结点后面
self.rear = s
def pop(self): # 出队操作
assert not self.empty() # 检测空链队
if self.front == self.rear: # 原链队只有一个结点
e = self.front.data # 取首结点值
self.front = self.rear = None # 置为空队
else: # 原链队有多个结点
e = self.front.data # 取首结点值
self.front = self.front.next # front指向下一个结点
return e
def gethead(self): # 取队头元素
assert not self.empty() # 检测空链队
e = self.front.data # 取首结点值
return e
def size(self): # 返回队中元素个数
p = self.front
n = 0
while p != None:
n += 1
p = p.next
return n
#主程序
if __name__ == '__main__':
t=LinkQueue()
t.push(4)
t.push(6)
t.push(1)
t.push(9)
print(" 队列元素个数:%d" % (t.size()))
print()
print("队头元素: %d" % (t.gethead()))
print(" 出队元素:%d" % (t.pop()))
print(" 队列元素个数:%d" % (t.size()))
print()
修改内容:
1. LinkNode类的构造方法中,将data的默认值改为None,因为如果不传入参数,data的值应该是空的。
2. LinkQueue类的empty方法中,判断条件应该是队头和队尾都为None才算是空队列。
3. LinkQueue类的size方法中,用指针p遍历队列,统计元素个数。
4. 主程序中,按照修改后的方法调用LinkQueue类的方法。
class RecordNode(object): def __init__(self, key, data): self.key = key self.data = data class SqList(object): def __init__(self, maxSize): self.maxSize = maxSize self.list = [None]*self.maxSize self.len = 0 def insert(self,i,x): if self.len == self.maxSize: raise Exception("顺序表已满") if i < 0 or i > self.len-1: raise Exception("插入位置不合理") for j in range(self.len-1 , i , -1): self.list[j] = self.list[j-1] self.list[i] = x self.len += 1这段代码有错吗
这段代码存在一个语法错误和一个逻辑错误。
语法错误:在RecordNode类的构造函数中,应该是`__init__`而不是`init`。因此,应该将以下代码:
```
class RecordNode(object):
def init(self, key, data):
self.key = key
self.data = data
```
改为:
```
class RecordNode(object):
def __init__(self, key, data):
self.key = key
self.data = data
```
逻辑错误:在SqList类的insert方法中,应该将`self.list[i] = x`移动到for循环之外。因此,应该将以下代码:
```
for j in range(self.len-1 , i , -1):
self.list[j] = self.list[j-1]
self.list[i] = x
```
改为:
```
for j in range(self.len-1 , i-1 , -1):
self.list[j+1] = self.list[j]
self.list[i] = x
```
这样才能正确地将新元素插入到指定位置。
修改后的代码如下:
```
class RecordNode(object):
def __init__(self, key, data):
self.key = key
self.data = data
class SqList(object):
def __init__(self, maxSize):
self.maxSize = maxSize
self.list = [None]*self.maxSize
self.len = 0
def insert(self,i,x):
if self.len == self.maxSize:
raise Exception("顺序表已满")
if i < 0 or i > self.len:
raise Exception("插入位置不合理")
for j in range(self.len-1 , i-1 , -1):
self.list[j+1] = self.list[j]
self.list[i] = x
self.len += 1
```
注意,修改后的代码中,插入位置允许在表的末尾插入元素,因此判断条件变为`i < 0 or i > self.len`。
阅读全文