題外話:震驚,之前賬號一直登不上,還以爲被封了呢,錯過了小夥伴的私信
需求
• 以優先級入隊,即入隊前要求隊列已排序,從而確定當前優先級所在位置。同優先級按先後次序入隊。
• 可由管理員對隊列內容進行修改,修改時應暫時鎖住隊列。
• 以優先級出隊,同優先級按當前位置(即入隊順序)出隊(若已排序,則可直接出隊操作而不需再判斷)。
• 採用數組存字典的形式,模擬隊列 {"pri":0, "msg":"txt"}
• 功能
a. 增
可插入數據(單個或全部)
b. 刪
可刪除指定 優先級 的數據(單個或全部)
c. 改
可修改指定 優先級和內容 的數據(單個)
d. 查
可查詢指定 優先級 的數據(單個或全部)
代碼
# coding:utf-8
'''
• 以優先級入隊,即入隊前要求隊列已排序,從而確定當前優先級所在位置。同優先級按先後次序入隊。
• 可由管理員對隊列內容進行修改,修改時應暫時鎖住隊列。
• 以優先級出隊,同優先級按當前位置(即入隊順序)出隊(若已排序,則可直接出隊操作而不需再判斷)。
• 採用數組存字典的形式,模擬隊列 {"pri":0, "msg":"txt"}
• 功能
a. 增
可插入數據(單個或全部)
b. 刪
可刪除指定 優先級 的數據(單個或全部)
c. 改
可修改指定 優先級和內容 的數據(單個)
d. 查
可查詢指定 優先級 的數據(單個或全部)
'''
class enhanceQueue:
def __init__(self):
self.queue = []
self.length = 0
self.unlock = True
# 批量插入數據,其中 arr -> [(pri, 'msg'), (pri, 'msg'), (pri, 'msg')]
def Create(self, arr):
self.queue.clear()
for item in arr:
priority = item[0]
value = item[1]
self.Push(priority, value)
return self.queue
# 插入單個數據
def Push(self, priority, value):
content = {"pri": priority, "msg": value}
if self.unlock:
self.unlock = False
if self.queue:
for i in range(len(self.queue)):
if self.queue[i]['pri'] > priority:
self.queue.insert(i, content)
self.length += 1
break
elif i+1 == len(self.queue):
self.queue.append(content)
self.length += 1
break
elif self.queue[i]['pri'] <= priority:
continue
self.unlock = True
else:
self.queue.append(content)
self.length += 1
self.unlock = True
# 出隊操作,以優先級出隊,同優先級按當前位置(即入隊順序)出隊
def Pop(self):
if self.queue and self.unlock:
self.unlock = False
self.length -= 1
pop = self.queue.pop(0)
self.unlock = True
return pop
else:
return None
# 刪除指定 優先級 的數據(其中,isall表示單個或全部同優先級)
def Delete(self, priority, isall=False):
if self.queue and self.unlock:
self.unlock = False
temp = []
for item in self.queue:
if item['pri'] == priority:
temp.append(item)
if isall:
continue
else:
break
for i in temp:
self.queue.remove(i)
self.length -= 1
self.unlock = True
# 查找指定 優先級 的數據(其中,isall表示單個或全部同優先級)
def Search(self, priority, isall=False):
temp = []
if self.queue and self.unlock:
self.unlock = False
for item in self.queue:
if item['pri'] == priority:
temp.append(item)
if isall:
continue
else:
break
self.unlock = True
return temp
# 修改指定 優先級和內容 的數據
def Modify(self, priority, oldvalue, newValue):
if self.queue and self.unlock:
self.unlock = False
for item in self.queue:
if item['pri'] == priority and item['msg'] == oldvalue:
item['msg'] = newValue
self.unlock = True
return True
self.unlock = True
return False
# 打印當前隊列,也可直接調用 obj.queue查看
def Display(self):
for i in self.queue:
print(i)
# 查詢是否是鎖定狀態
def IsLock(self):
return self.unlock
# 清空整個隊列
def ClearAll(self):
if self.unlock:
self.unlock = False
self.queue.clear()
self.unlock = True
def test():
queue = enhanceQueue()
print('*' * 40)
print(">> 批量創建隊列")
print("輸入的數據: [(3, 'a'), (1, 'b'), (5, 'c'), (2, 'c'), (7, 'c'), (5, 'c')]")
queue.Create([(3, 'a'), (1, 'b'), (5, 'c'), (2, 'c'), (7, 'c'), (5, 'c')])
print("輸出的數據: ", queue.queue)
print('*' * 40)
print(">> 清空整個隊列")
queue.ClearAll()
print("輸出的數據: ", queue.queue)
print('*' * 40)
print(">> 單個輸入數據")
print("輸入的數據: (3, 'a'), (1, 'b'), (5, 'c'), (2, 'c'), (7, 'c'), (5, 'c')")
queue.Push(3, 'a')
queue.Push(1, 'b')
queue.Push(5, 'c')
queue.Push(2, 'd')
queue.Push(7, 'e')
queue.Push(5, 'f')
print("輸出的數據: ", queue.queue)
print('*' * 40)
print(">> 出隊一個數據")
queue.Pop()
print("剩餘的數據: ", queue.queue)
print('*' * 40)
print(">> 搜索指定優先級的單個數據, 如5")
print("剩餘的數據: ", queue.Search(5))
print('*' * 40)
print(">> 搜索指定優先級的全部數據, 如5")
print("剩餘的數據: ", queue.Search(5, True))
print('*' * 40)
print(">> 修改指定 優先級和內容 的數據, 如5,c->5,o")
queue.Modify(5, 'c', 'o')
print("修改後的數據: ", queue.Search(5))
print('*' * 40)
print(">> 刪除指定優先級的單個數據, 如2")
queue.Delete(5)
print("刪除後的數據: ", queue.queue)
print('*' * 40)
print(">> 刪除指定優先級的全部數據, 如5")
queue.Delete(5, True)
print("刪除後的數據: ", queue.queue)
if __name__ == '__main__':
test()
****************************************
>> 批量創建隊列
輸入的數據: [(3, 'a'), (1, 'b'), (5, 'c'), (2, 'c'), (7, 'c'), (5, 'c')]
輸出的數據: [{'pri': 1, 'msg': 'b'}, {'pri': 2, 'msg': 'c'}, {'pri': 3, 'msg': 'a'}, {'pri': 5, 'msg': 'c'}, {'pri': 5, 'msg': 'c'}, {'pri': 7, 'msg': 'c'}]
****************************************
>> 清空整個隊列
輸出的數據: []
****************************************
>> 單個輸入數據
輸入的數據: (3, 'a'), (1, 'b'), (5, 'c'), (2, 'c'), (7, 'c'), (5, 'c')
輸出的數據: [{'pri': 1, 'msg': 'b'}, {'pri': 2, 'msg': 'd'}, {'pri': 3, 'msg': 'a'}, {'pri': 5, 'msg': 'c'}, {'pri': 5, 'msg': 'f'}, {'pri': 7, 'msg': 'e'}]
****************************************
>> 出隊一個數據
剩餘的數據: [{'pri': 2, 'msg': 'd'}, {'pri': 3, 'msg': 'a'}, {'pri': 5, 'msg': 'c'}, {'pri': 5, 'msg': 'f'}, {'pri': 7, 'msg': 'e'}]
****************************************
>> 搜索指定優先級的單個數據, 如5
剩餘的數據: [{'pri': 5, 'msg': 'c'}]
****************************************
>> 搜索指定優先級的全部數據, 如5
剩餘的數據: [{'pri': 5, 'msg': 'c'}, {'pri': 5, 'msg': 'f'}]
****************************************
>> 修改指定 優先級和內容 的數據, 如5,c->5,o
修改後的數據: [{'pri': 5, 'msg': 'o'}]
****************************************
>> 刪除指定優先級的單個數據, 如2
刪除後的數據: [{'pri': 2, 'msg': 'd'}, {'pri': 3, 'msg': 'a'}, {'pri': 5, 'msg': 'f'}, {'pri': 7, 'msg': 'e'}]
****************************************
>> 刪除指定優先級的全部數據, 如5
刪除後的數據: [{'pri': 2, 'msg': 'd'}, {'pri': 3, 'msg': 'a'}, {'pri': 7, 'msg': 'e'}]