线性表又叫顺序表,是一种最基本的数据结构,是n个类型相同数据元素的有限序列,就是用一组连续的内存单元依次存放线性表中的元素。线性表元素之间的逻辑关系可以通过元素间的存储顺序反应出来。
与列表不同,为了方便计算和理解,我将线性表的索引从1开始计数。
定义的主要方法如下:
- add()——在尾部添加元素
- insert()——在索引处添加元素
- delete()——删除索引处的元素
- findelem()——返回索引处的值
- length()——返回线性表长度
- showlist()——展示线性表
class mysqlist():
'''顺序表/线性表'''
def __init__(self, size):
self.size = size
self.sqlist = [0]
def add(self,data):
'''在尾部添加元素'''
self.sqlist.append(data)
def insert(self, index, data):
'''在索引index处插入x'''
if index < 1 or index > self.size:
raise IndexError("插入位置错误")
else:
self.sqlist.insert(index, data)
def delete(self, index):
'''删除索引index处的值'''
if index < 1 or index > self.size:
raise IndexError("删除位置错误")
else:
return self.sqlist.pop(index)
def findelem(self, index):
'''返回索引index处的值'''
if index < 1 or index > self.size:
raise IndexError("查询位置错误")
else:
return self.sqlist[index]
def length(self):
'''返回线性表长度'''
return len(self.sqlist)-1
def showlist(self):
'''输出线性表'''
return self.sqlist[1:]
下面我将用线性表解决约瑟夫环问题。
约瑟夫环:设n个人围坐在一个圆桌周围,现在从第s个人开始报数,数到第m个人,让他出局;然后从出局的下一个人重新开始报数,数到第m个人,再让他出局,……,如此反复直到所有的人全部出局为止。要解决的Josephus问题是:对于任意给定的n, s 和m,求出这n 个人的出局序列。
我主要依靠 index = (index+m-1) % length 取余语句实现循环。index为线性表中每个人的下标。
循环完成后线性表中还有一位,便是幸存者,也要加到result中。
if __name__ == "__main__":
# m是数到第几个人死亡,n是总人数,s是从第几个开始数
print("线性表约瑟夫环".center(40,'-'))
n = int(input("请输入总人数:"))
s = int(input("请输入从第几个人开始报数:"))
m = int(input("请输入数到第几个人出局:"))
result = []
index = s
y = mysqlist(n)
for i in range(1, n+1):
y.add(i)
while y.length() > 1:
length = y.length()
index = (index+m-1) % length
if index ==0:
index = length
temp = y.delete(index)
result.append(temp)
result.append(y.findelem(1))
print(f"\n死亡顺序为:{result}")