HDU 1509 windows message queue

问题:消息队列是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;
			}
		}
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值