7-26 Windows消息队列(25 分)

消息队列是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!
解题思路:本题主要是建立一个小顶堆,难一点的是输出后的重建,需要模拟一下过程
 #include<stdio.h>
#include<stdlib.h>
#include<string.h> typedef struct Node *node;
struct Node
{
char mes[];
int priority;
}; struct
{
node heap[];
int num;
} Heap; void Put();
void Get(); int main()
{
int n;
scanf("%d",&n);
Heap.heap[] = (node)malloc( sizeof(struct Node));
Heap.heap[]->priority = -;
Heap.num = ; while( n--)
{
char op[];
getchar();
scanf("%s",op);
switch( op[])
{
case 'P' :
Put();
break;
case 'G' :
Get();
break;
default :
break;
}
} return ;
} void Put()
{
//读入数据,建立一个小顶堆
int i;
node temp = ( node ) malloc( sizeof( struct Node));
scanf("%s %d",temp->mes,&temp->priority);
for( i=++Heap.num; Heap.heap[i/]->priority > temp->priority; i=i/)
{
Heap.heap[i] = Heap.heap[i/];
}
Heap.heap[i] = temp;
} void Get()
{
//输出数据,重建顶堆
int i; if( Heap.num<)
{
printf("EMPTY QUEUE!\n");
return ;
}
printf("%s\n",Heap.heap[]->mes);
for( i=; i*<Heap.num; )
{
if( i*+<Heap.num && Heap.heap[i*+]->priority<Heap.heap[i*]->priority)
{
//如果有两个根节点,并且右结点优先数小于左结点优先数
if( Heap.heap[i*+]->priority<Heap.heap[Heap.num]->priority)
{
Heap.heap[i] = Heap.heap[i*+];
i=i*+;
}
else break;
}
else
{
if(Heap.heap[i*]->priority < Heap.heap[Heap.num]->priority)
{
Heap.heap[i] = Heap.heap[i*];
i *= ;
}
else break;
}
}
Heap.heap[i] = Heap.heap[Heap.num--]; //将最后的一个元素补在空缺
}

 

7-26 Windows消息队列(25 分)(堆排序)的更多相关文章

  1. 5-2 Windows消息队列 (25分)

    5-2 Windows消息队列   (25分) 消息队列是Windows系统的基础.对于每个进程,系统维护一个消息队列.如果在进程中有特定事件发生,如点击鼠标.文字改变等,系统将把这个消息加到队列当中 ...

  2. PTA 7-3 Windows消息队列 (25分)

    PTA 7-3 Windows消息队列 (25分) 消息队列是Windows系统的基础.对于每个进程,系统维护一个消息队列.如果在进程中有特定事件发生,如点击鼠标.文字改变等,系统将把这个消息加到队列 ...

  3. 7-26 Windows消息队列

    7-26 Windows消息队列(25 分) 消息队列是Windows系统的基础.对于每个进程,系统维护一个消息队列.如果在进程中有特定事件发生,如点击鼠标.文字改变等,系统将把这个消息加到队列当中. ...

  4. .Net下的进程间的通讯 -- Windows消息队列

    Windows 消息队列(MSMQ),是微软Windows2000以上的操作系统的一个服务,可以提供在计算机间消息的可靠传输,用来在两个进程间进行异步通讯最合适不过了.在.Net中有一个Message ...

  5. Windows消息队列(优先队列,结构体中放比较函数)

    Windows消息队列 消息队列是Windows系统的基础.对于每个进程,系统维护一个消息队列.如果在进程中有特定事件发生,如点击鼠标.文字改变等,系统将把这个消息加到队列当中.同时,如果队列不是空的 ...

  6. 细说UI线程和Windows消息队列(经典)

    在Windows应用程序中,窗体是由一种称为“UI线程(User Interface Thread)”的特殊类型的线程创建的. 首先,UI线程是一种“线程”,所以它具有一个线程应该具有的所有特征,比如 ...

  7. 细说UI线程和Windows消息队列

    在 Windows应用程序中,窗体是由一种称为“ UI线程( User Interface Thread)”的特殊类型的线程创建的. 首先, UI线程是一种“线程”,所以它具有一个线程应该具有的所有特 ...

  8. Windows消息队列

    一 Windows中有一个系统消息队列,对于每一个正在执行的Windows应用程序,系统为其建立一个“消息队列”,即应用程序队列,用来存放该程序可能 创建的各种窗口的消息.应用程序中含有一段称作“消息 ...

  9. ZOJ 2724 Windows 消息队列 (优先队列)

    链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2724 Message queue is the basic fund ...

随机推荐

  1. C#中如何判断键盘按键和组合键

    好记性不如烂笔头子,现在记录下来,不一定会有很详尽的实例,只写最核心的部分. C# winform的窗体类有KeyPreview属性,可以接收窗体内控件的键盘事件注册.窗体和控件都有KeyDown,K ...

  2. 一命令安装nginx

    #!/bin/bash yum -y install wget pcre-devel openssl openssl-devel libtool gcc automake autoconf libto ...

  3. APP增量更新

    增量更新的概念: 当我们手机上安装的app版本与服务器的最新版本不一致的时候,传统做法是重新下载安装一个最新版的apk文件,不过这种方式比较耗流量,不利于用户体验.增量更新就是只下载当前app版本与最 ...

  4. git 学习笔记1

    目前我属于粗放型的[学习者],接下来需要做一些改变,让自己更加规范.首先需要学习的就是版本控制系统,本科在工作室的时候使用过一点Subversion,不过到现在已经基本没有印象了.git现在越来越成为 ...

  5. vscode增加sftp扩展

    下载 sftp-sync 扩展插件 填写配置 快捷键 ctrl+shift+P 打开指令窗口,输入sftp:config,回车,就会在当前工作工程的.vscode文件夹下生成一个sftp.json文件 ...

  6. PostgreSQL 数据库错误状态编号解释[附带列表

    PostgreSQL 服务器发出的所有消息都赋予了五个字符的错误代码, 这些代码遵循 SQL 的 "SQLSTATE" 代码的习惯.需要知道发生了什么错误条件的应用通常应该测试错误 ...

  7. 关于AMAZON SES设置的一些要点

    1.首先要有一个企业邮箱,如果没有可以去腾讯(http://exmail.qq.com/onlinesell/intro)申请一个,网易也有,不过解析几次搞了两天都是未通过,腾讯几分钟就好了 企业邮箱 ...

  8. python中统计计数的几种方法和Counter的介绍

    使用字典dict()alist=['a','b','a','c','b','b',1,3]count_dict = dict()for i in alist:count_dict[i]=count_d ...

  9. git的使用 及一些常见的错误处理

    git安装使用 添加文件到Git仓库,分两步: 1.使用命令git add <file>,注意,可反复多次使用,添加多个文件: 2.使用命令git commit -m <messag ...

  10. 第3节 hive高级用法:13、hive的函数

    4.2.Hive参数配置方式 Hive参数大全: https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties 开 ...