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();
    			}
    		}
    	
    	}
    
    
    
    }
  • 相关阅读:
    Struts2SpringHibernate整合示例,一个HelloWorld版的在线书店(项目源码+详尽注释+单元测试)
    Java实现蓝桥杯勇者斗恶龙
    Java实现 LeetCode 226 翻转二叉树
    Java实现 LeetCode 226 翻转二叉树
    Java实现 LeetCode 226 翻转二叉树
    Java实现 LeetCode 225 用队列实现栈
    Java实现 LeetCode 225 用队列实现栈
    Java实现 LeetCode 225 用队列实现栈
    Java实现 LeetCode 224 基本计算器
    Java实现 LeetCode 224 基本计算器
  • 原文地址:https://www.cnblogs.com/Jason66661010/p/12789010.html
Copyright © 2011-2022 走看看