熱線電話:13121318867

登錄
首頁精彩閱讀Python實現的數據結構與算法之隊列詳解
Python實現的數據結構與算法之隊列詳解
2018-02-19
收藏

Python實現的數據結構與算法之隊列詳解

本文實例講述了Python實現的數據結構與算法之隊列。分享給大家供大家參考。具體分析如下:

一、概述

隊列(Queue)是一種先進先出(FIFO)的線性數據結構,插入操作在隊尾(rear)進行,刪除操作在隊首(front)進行。

二、ADT

隊列ADT(抽象數據類型)一般提供以下接口:

① Queue() 創建隊列
② enqueue(item) 向隊尾插入項
③ dequeue() 返回隊首的項,并從隊列中刪除該項
④ empty() 判斷隊列是否為空
⑤ size() 返回隊列中項的個數

隊列操作的示意圖如下:

三、Python實現

使用Python的內建類型list列表,可以很方便地實現隊列ADT:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
classQueue:
  def__init__(self):
    self.items=[]
  defenqueue(self, item):
    self.items.append(item)
  defdequeue(self):
    returnself.items.pop(0)
  defempty(self):
    returnself.size()==0
  defsize(self):
    returnlen(self.items)

四、應用

著名的 約瑟夫斯問題(Josephus Problem)是應用隊列(確切地說,是循環隊列)的典型案例。在 約瑟夫斯問題 中,參與者圍成一個圓圈,從某個人(隊首)開始報數,報數到n+1的人退出圓圈,然后從退出人的下一位重新開始報數;重復以上動作,直到只剩下一個人為止。

值得注意的是,Queue類只實現了簡單隊列,上述問題實際上需要用循環隊列來解決。在報數過程中,通過“將(從隊首)出隊的人再入隊(到隊尾)”來模擬循環隊列的行為。具體代碼如下:

/usr/bin/env python

# -*- coding: utf-8 -*-
defjosephus(namelist, num):
simqueue=Queue()
fornameinnamelist:
simqueue.enqueue(name)
whilesimqueue.size() >1:
foriinxrange(num):
simqueue.enqueue(simqueue.dequeue())
simqueue.dequeue()
returnsimqueue.dequeue()
if__name__=='__main__':
print(josephus(["Bill","David","Kent","Jane","Susan","Brad"],3))

運行結果:

$ python josephus.py
Susan

希望本文所述對大家的Python程序設計有所幫助。


數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢