【数据结构】Python实现线性表+解决约瑟夫环问题

线性表又叫顺序表,是一种最基本的数据结构,是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}")

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值