HDU 1509 windows message queue

来源:互联网 发布:出境旅游数据 编辑:程序博客网 时间:2024/06/08 04:33

问题:消息队列是windows系统的重要基础。对于每一个进程,系统都包含一个消息队列。如果进程被触发,比如鼠标点击,文本转换,系统会给队列增加一个消息。期间,进程会循环按照优先级值从队列中取消息,在消息队列不为空的情况下。注意到低的优先级值代表高的优先级。这个问题中,你被要求模拟在消息队列中放消息和取消息的过程。

输入:只有一个案例测试。每一行是一个要求。GET 或者PUT,分布代表取放消息。PUT后面跟随一个字符串代表消息名称,两个整数代表参数和优先级。最多有60000个要求。注意到一个消息可以出现两次或者更多次,如果两个消息有同样的优先级,那么遵循FIFO,先入先出的原则。

输出:对于每一个GET指令,输出本次取出消息的名称和参数值,如果队列为空,输出”EMPTY QUEUE!“,PUT指令无输出。

Sample Input
GETPUT msg1 10 5PUT msg2 10 4GETGETGET
 

Sample Output
EMPTY QUEUE!msg2 10msg1 10EMPTY QUEUE!
import java.util.*;public class WMQ {public static void main(String[] args) {PriorityQueue<Message> pq = new PriorityQueue<Message>(60000,new MessageCom());   //优先级队列Scanner cin = new Scanner(System.in);int count = 0;while (cin.hasNext()) {String command = cin.next();if (command.equals("GET")) {if (pq.isEmpty())System.out.println("EMPTY QUEUE!");elseSystem.out.println(pq.poll());}if (command.equals("PUT")) {String name = cin.next();int parameter = cin.nextInt();int pValue = cin.nextInt();Message message = new Message(name, parameter, pValue, count++);pq.offer(message);}}}}class Message {public int parameter;public int pValue;public String name;public int id;public Message(String name, int parameter, int pValue, int id) {this.name = name;this.parameter = parameter;this.pValue = pValue;this.id = id;}public String toString() {return this.name + " " + this.parameter;}}class MessageCom implements Comparator<Message> {                   //创建一个实现了比较器的类,初入优先队列的创建中。public int compare(Message message1,Message message2) {         //优先按优先值排序,如果优先值相等,则按先来的,id小的if (message1.pValue > message2.pValue)return 1;else if (message1.pValue < message2.pValue)return -1;else {if (message1.id < message2.id) {return -1;} else if (message1.id > message2.id) {return 1;} else {return 0;}}}}


0 0
原创粉丝点击