Python實現資料結構佇列約瑟夫環問題
阿新 • • 發佈:2018-12-15
問題描述:
人們站在一個等待被處決的圈子裡。 計數從圓圈中的指定點開始,並沿指定方向圍繞圓圈進行。 在跳過指定數量的人之後,執行下一個人。 對剩下的人重複該過程,從下一個人開始,朝同一方向跳過相同數量的人,直到只剩下一個人,並被釋放。問題即,給定人數、起點、方向和要跳過的數字,選擇初始圓圈中的位置以避免被處決。
約瑟夫環用佇列實現,下面的程式碼是用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