理論部分
- 用數組實現一個順序隊列。
- 用數組實現一個循環隊列。
- 用鏈表實現一個鏈式隊列。
隊列: 是一種先進先出(FIFO)的線性表,它只允許在表的一端插入元素,而在表的另一端刪除元素。在隊列中,允許插入元素的一端稱爲隊尾(Rear),允許刪除元素的一端稱爲對頭(Front)。
順序隊列: 隊列的順序存儲結構是指利用一組地址連續的存儲單元存放隊列的元素。
循環隊列: 將順序隊列假想成一個環狀結構,稱之爲循環隊列。
鏈隊列: 用鏈表表示的隊列簡稱爲鏈隊列。
練習部分
- 模擬銀行服務完成程序代碼。
目前,在以銀行營業大廳爲代表的窗口行業中大量使用排隊(叫號)系統,該系統完全模擬了人羣排隊全過程,通過取票進隊、排隊等待、叫號服務等功能,代替了人們站隊的辛苦。
排隊叫號軟件的具體操作流程爲:
顧客取服務序號
當顧客抵達服務大廳時,前往放置在入口處旁的取號機,並按一下其上的相應服務按鈕,取號機會自動打印出一張服務單。單上顯示服務號及該服務號前面正在等待服務的人數。
服務員工呼叫顧客
服務員工只需按一下其櫃檯上呼叫器的相應按鈕,則顧客的服務號就會按順序的顯示在顯示屏上,併發出“叮咚”和相關語音信息,提示顧客前往該窗口辦事。當一位顧客辦事完畢後,櫃檯服務員工只需按呼叫器相應鍵,即可自動呼叫下一位顧客。
編寫程序模擬上面的工作過程,主要要求如下:
程序運行後,當看到“請點擊觸摸屏獲取號碼:”的提示時,只要按回車鍵,即可顯示“您的號碼是:XXX,您前面有YYY位”的提示,其中XXX是所獲得的服務號碼,YYY是在XXX之前來到的正在等待服務的人數。
用多線程技術模擬服務窗口(可模擬多個),具有服務員呼叫顧客的行爲,假設每個顧客服務的時間是10000ms,時間到後,顯示“請XXX號到ZZZ號窗口!”的提示。其中ZZZ是即將爲客戶服務的窗口號。
import time
import threading
# 實現棧這個類
class Queue:
def __init__(self):
self.items = []
def isEmpty(self):
return self.items == []
def enqueue(self, item):
self.items.insert(0,item)
def dequeue(self):
if self.items != []:
return self.items.pop()
else:
return False
def size(self):
return len(self.items)
def top(self):
if self.items != []:
return self.items[len(self.items)-1]
else:
return False
# 實現銀行櫃檯叫號功能
class Counter(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.waitQueue = Queue() # 初始化等待的隊伍
self.lock = threading.Lock()
def callIng(self):
while True:
# 櫃檯一直叫號,要一直循環
time.sleep(10)
if not self.waitQueue.isEmpty():
self.lock.acquire()
print("請{}號客戶,到{}號窗口辦理業務".format(self.waitQueue.top(), threading.current_thread().name))
self.waitQueue.dequeue()
self.lock.release()
class bankSystem:
def __init__(self):
self.serviceQueue = Queue()
self.nowNum = 0
# self.windows = k # 銀行櫃檯數目
self.maxSize = 100
def getNumber(self):
if self.nowNum < self.maxSize:
self.nowNum += 1
return self.nowNum
else:
print("現在業務繁忙,請稍後再來")
if __name__ == "__main__":
bank_sys = bankSystem()
windowcount = 3
serviceWindow = [None] * windowcount
threadList = [None] * windowcount
for i in range(windowcount):
serviceWindow[i] = Counter()
serviceWindow[i].waitQueue = bank_sys.serviceQueue
threadList[i] = threading.Thread(name=(i + 1), target=serviceWindow[i].callIng, args=())
threadList[i].start()
# threadList[i].join()
while True:
input("請點擊觸摸屏獲取號碼:")
callNumber = bank_sys.getNumber()
if bank_sys.serviceQueue != None:
print("當前您的的號碼爲{},您前面還有{}個人".format(str(callNumber), str(bank_sys.serviceQueue.size())))
bank_sys.serviceQueue.enqueue(bank_sys.nowNum)
else:
print('您的號碼是:{},您前面有 0 位'.format(callNumber))