需求
• 以优先级入队,即入队前要求队列已排序,从而确定当前优先级所在位置。同优先级按先后次序入队。
• 可由管理员对队列内容进行修改,修改时应暂时锁住队列。
• 以优先级出队,同优先级按当前位置(即入队顺序)出队(若已排序,则可直接出队操作而不需再判断)。
• 采用数组存字典的形式,模拟队列 {"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'}]