(Python)支持优先级的队列

实现一个支持优先级的队列,高优先级先出队列;同优先级时先进先出。

如果两个输入数据和优先级都相同,则后一个数据不入队列被丢弃。

输入:

一组待存入队列的数据(包含内容和优先级)

输出:

队列的数据内容(优先级信息输出时不再体现)

不用考虑输入数据不合法的情况,测试数据不超过 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()

猜你喜欢

转载自blog.csdn.net/qq_43486538/article/details/133721986