1. 程式人生 > >Python實現資料結構佇列約瑟夫環問題

Python實現資料結構佇列約瑟夫環問題

問題描述:

人們站在一個等待被處決的圈子裡。 計數從圓圈中的指定點開始,並沿指定方向圍繞圓圈進行。 在跳過指定數量的人之後,執行下一個人。 對剩下的人重複該過程,從下一個人開始,朝同一方向跳過相同數量的人,直到只剩下一個人,並被釋放。問題即,給定人數、起點、方向和要跳過的數字,選擇初始圓圈中的位置以避免被處決。

約瑟夫環用佇列實現,下面的程式碼是用Python描述的約瑟夫環問題: 

class List(object):
    #用列表儲存名字模擬環
    def __init__(self):
        self.list = []
    # 歸零列表
    def Empty(self):
        return self.list == []
    #將傳入名字放入操作的列表中
    def Join(self,item):
        self.list.insert(0, item)
    #彈出元素
    def Pop(self):
        return self.list.pop()
    # 獲取元素個數
    def Length(self):
        return len(self.list)

def Johnson(k, namelist):
    s = List()
    #將傳入的名字依次填入操作的列表
    for i in range(len(namelist)):
        s.Join(namelist[i])
    print(namelist)
    i = 1
    #如果不是隻剩下一個人就繼續
    while s.Length() != 1:
        temp = s.Pop()#碰到一個就刪除
        if (i != k):
            s.Join(temp)#如果不是要刪除的序號就再加入佇列
        else:
            i=0#重新計數
        i=i+1
    return s.Pop()#最後留下的人

if __name__ == '__main__':
    nameList = ['Aha', 'Bob', 'Cindy']
    print("\n這個環裡有:")
    print("\n最後出列的是:"+Johnson(2,nameList))

結果:

這個環裡有:
['Aha', 'Bob', 'Cindy']

最後出列的是:Cindy