zoukankan      html  css  js  c++  java
  • 数据结构与算法题目集(中文)7-26 Windows消息队列 (25分) 优先队列

    1.题目

    消息队列是Windows系统的基础。对于每个进程,系统维护一个消息队列。如果在进程中有特定事件发生,如点击鼠标、文字改变等,系统将把这个消息加到队列当中。同时,如果队列不是空的,这一进程循环地从队列中按照优先级获取消息。请注意优先级值低意味着优先级高。请编辑程序模拟消息队列,将消息加到队列中以及从队列中获取消息。

    输入格式:

    输入首先给出正整数N(≤10​5​​),随后N行,每行给出一个指令——GETPUT,分别表示从队列中取出消息或将消息添加到队列中。如果指令是PUT,后面就有一个消息名称、以及一个正整数表示消息的优先级,此数越小表示优先级越高。消息名称是长度不超过10个字符且不含空格的字符串;题目保证队列中消息的优先级无重复,且输入至少有一个GET

    输出格式:

    对于每个GET指令,在一行中输出消息队列中优先级最高的消息的名称和参数。如果消息队列中没有消息,输出EMPTY QUEUE!。对于PUT指令则没有输出。

    输入样例:

    9
    PUT msg1 5
    PUT msg2 4
    GET
    PUT msg3 2
    PUT msg4 4
    GET
    GET
    GET
    GET
    

    输出样例:

    msg2
    msg3
    msg4
    msg1
    EMPTY QUEUE!

    2.题目分析

    1.使用优先队列存放PUT进来的数据,优先队列会自动进行排序,之后GET输出

     2.优先队列priority_queue的相关知识(参考https://www.cnblogs.com/flipped/p/5691430.html

    头文件使用:#include<queue>

    默认从大到小排列:priority_queue<node>q;

    自带的比较函数:

    priority_queue<int, vector<int>, less<int> > q;//等价于默认,从大到小排
    //greater<int> 从小到大排

    如果队列中的数据是自定义的结构体,那么有三种方法进行排序的定义:

    1.重载操作符

    bool operator < (const node &a, const node &b) 
     {
         return a.value < b.value; // 按照value从大到小排列
         return a.value > b.value; // 按照value从小到大排列
     } 
    priority_queue<node>q;
    

    (const node &a是用引用传递,比按值传递node a效率更高,效果是一样的)

    2.自定义比较函数模板结构 

    struct cmp{
    
        bool operator ()(const node &a, const node &b)
        {
            return a.value>b.value;// 按照value从小到大排列
        }
    };
    priority_queue<node, vector<node>, cmp>q;

     3.定义友元操作类重载函数

    struct node{
        int value;
        friend bool operator<(const node &a,const node &b){
            return a.value<b.value;  //按value从大到小排列
        }
    };
    priority_queue<node>q;

     3.代码

    #include<iostream>
    #include<queue>
    #include<string>
    #include<cstdio>
    using namespace std;
    struct node
    {
    	char  list[20];
    	int number;
    	friend bool operator < (node a, node b)//注意格式
    	{
    		return a.number > b.number;
    	}
    
    };
    
    int  main()
    {
    	priority_queue<node> aa;
    	int amount;
    	cin >> amount;
    	for (int i = 0; i < amount; i++)
    	{
    		char temp[20];
    		scanf("%s", temp);
    		if (temp[0]=='P')
    		{
    			node temp2;
    			scanf("%s", temp2.list);
    			scanf("%d", &temp2.number);
    			aa.push(temp2);
    		}
    		if (temp[0]=='G')
    		{
    			if (aa.empty())
    			{
    				cout << "EMPTY QUEUE!" << endl;
    			}
    			else
    			{
    				printf("%s
    ", aa.top().list);
    				aa.pop();
    			}
    		}
    	
    	}
    
    
    
    }
  • 相关阅读:
    cropper图片剪裁 , .toBlob()报错
    clipboard异步复制文本(动态获取文本)
    ng-model 数据不更新 及 ng-repeat【ngRepeat:dupes】错误
    MongoVUE的Collections数据不显示的解决方法
    AngularJS监听路由变化
    bootstrap在ie8下,兼容媒体查询
    css3 animation动画特效插件的巧用
    前端图片canvas,file,blob,DataURL等格式转换
    「每日一码」(精品代码,质量保证)阶乘
    「每日一码」(精品代码,质量保证)empty和undefined
  • 原文地址:https://www.cnblogs.com/Jason66661010/p/12789010.html
Copyright © 2011-2022 走看看