问题:消息队列是windows系统的重要基础。对于每一个进程,系统都包含一个消息队列。如果进程被触发,比如鼠标点击,文本转换,系统会给队列增加一个消息。期间,进程会循环按照优先级值从队列中取消息,在消息队列不为空的情况下。注意到低的优先级值代表高的优先级。这个问题中,你被要求模拟在消息队列中放消息和取消息的过程。
输入:只有一个案例测试。每一行是一个要求。GET 或者PUT,分布代表取放消息。PUT后面跟随一个字符串代表消息名称,两个整数代表参数和优先级。最多有60000个要求。注意到一个消息可以出现两次或者更多次,如果两个消息有同样的优先级,那么遵循FIFO,先入先出的原则。
输出:对于每一个GET指令,输出本次取出消息的名称和参数值,如果队列为空,输出”EMPTY QUEUE!“,PUT指令无输出。
Sample Input
GET PUT msg1 10 5 PUT msg2 10 4 GET GET GET
Sample Output
EMPTY QUEUE! msg2 10 msg1 10 EMPTY 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!");
else
System.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;
}
}
}
}