实现一个支持优先级的队列,高优先级先出队列;同优先级时先进先出。
如果两个输入数据和优先级都相同,则后一个数据不入队列被丢弃。
输入:
一组待存入队列的数据(包含内容和优先级)
输出:
队列的数据内容(优先级信息输出时不再体现)
不用考虑输入数据不合法的情况,测试数据不超过 100 个
示例一:
输入:
(10,1),(20,1),(30,2),(40,3)
输出:
40,30,10,20
说明:
输入样例中,向队列写入了 4 个数据,每个数据由数据内容和优先级组成。
输入和输出内容都不含空格。
数据 40 的优先级最高,所以最先输出,其次是 30;
10 和 20 优先级相同,所以按输入顺序输出。
示例二:
输入:
(10,1),(10,1),(30,2),(40,3)
输出:
40,30,10
说明:
输入样例中,向队列写入了 4 个数据,每个数据由数据内容和优先级组成。
输入和输出内容都不含空格。
数据 40 的优先级最高,所以最先输出,其次是 30;
两个 10 和 10 构成重复数据,被丢弃一个。
from queue import PriorityQueue
class Task:
def __init__(self, val, pri, index):
self.val = val
self.pri = pri
self.index = int(index)
def __lt__(self, other):
if self.pri == other.pri:
return self.index < other.index
else:
return self.pri > other.pri
def main():
in_list = list(eval(input()))
in_list = [x + tuple(str(i)) for i, x in enumerate(in_list) if x not in in_list[:i]] # 去重+重组,将索引加入到列表元组中
n = len(in_list)
pq = PriorityQueue()
for s in in_list:
pq.put(Task(s[0], s[1], s[2]))
while pq and n > 0:
p = pq.get()
print(p.val, end=" ")
n -= 1
if __name__ == "__main__":
main()