7-26 Windows消息队列(25 分)(堆排序)
7-26 Windows消息队列(25 分)
消息队列是Windows系统的基础。对于每个进程,系统维护一个消息队列。如果在进程中有特定事件发生,如点击鼠标、文字改变等,系统将把这个消息加到队列当中。同时,如果队列不是空的,这一进程循环地从队列中按照优先级获取消息。请注意优先级值低意味着优先级高。请编辑程序模拟消息队列,将消息加到队列中以及从队列中获取消息。
输入格式:
输入首先给出正整数N(≤105),随后N行,每行给出一个指令——GET或PUT,分别表示从队列中取出消息或将消息添加到队列中。如果指令是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 分)(堆排序)的更多相关文章
- 5-2 Windows消息队列 (25分)
5-2 Windows消息队列 (25分) 消息队列是Windows系统的基础.对于每个进程,系统维护一个消息队列.如果在进程中有特定事件发生,如点击鼠标.文字改变等,系统将把这个消息加到队列当中 ...
- PTA 7-3 Windows消息队列 (25分)
PTA 7-3 Windows消息队列 (25分) 消息队列是Windows系统的基础.对于每个进程,系统维护一个消息队列.如果在进程中有特定事件发生,如点击鼠标.文字改变等,系统将把这个消息加到队列 ...
- 7-26 Windows消息队列
7-26 Windows消息队列(25 分) 消息队列是Windows系统的基础.对于每个进程,系统维护一个消息队列.如果在进程中有特定事件发生,如点击鼠标.文字改变等,系统将把这个消息加到队列当中. ...
- .Net下的进程间的通讯 -- Windows消息队列
Windows 消息队列(MSMQ),是微软Windows2000以上的操作系统的一个服务,可以提供在计算机间消息的可靠传输,用来在两个进程间进行异步通讯最合适不过了.在.Net中有一个Message ...
- Windows消息队列(优先队列,结构体中放比较函数)
Windows消息队列 消息队列是Windows系统的基础.对于每个进程,系统维护一个消息队列.如果在进程中有特定事件发生,如点击鼠标.文字改变等,系统将把这个消息加到队列当中.同时,如果队列不是空的 ...
- 细说UI线程和Windows消息队列(经典)
在Windows应用程序中,窗体是由一种称为“UI线程(User Interface Thread)”的特殊类型的线程创建的. 首先,UI线程是一种“线程”,所以它具有一个线程应该具有的所有特征,比如 ...
- 细说UI线程和Windows消息队列
在 Windows应用程序中,窗体是由一种称为“ UI线程( User Interface Thread)”的特殊类型的线程创建的. 首先, UI线程是一种“线程”,所以它具有一个线程应该具有的所有特 ...
- Windows消息队列
一 Windows中有一个系统消息队列,对于每一个正在执行的Windows应用程序,系统为其建立一个“消息队列”,即应用程序队列,用来存放该程序可能 创建的各种窗口的消息.应用程序中含有一段称作“消息 ...
- ZOJ 2724 Windows 消息队列 (优先队列)
链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2724 Message queue is the basic fund ...
随机推荐
- Struts2 表单提交与execute()方法的结合使用
1.创建web项目,添加struts2支持的类库,在web.xml中配置struts2过滤器. 2.创建名为UserAction的Action对象,并在其中编写execute()方法,代码如下所示: ...
- 转 oracle apex 使用
https://wenku.baidu.com/view/e5a4226955270722182ef725.html
- .net 发送邮件验证码
using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Net.Ma ...
- String的用法——获取功能
package cn.itcast_04; /* String类获取功能 int length():获取字符的长度 char charAt(int index):获取指定索引位置的字符 int ind ...
- AJPFX总结JAVA基本数据类型
1:关键字(掌握) (1)被Java语言赋予特定含义的单词 (2)特点: 全部小写. (3)注意事项: ...
- Rxlifecycle使用详解,解决RxJava内存泄露问题
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/1122/3711.html
- SQL Case 语句的使用
-----简单case 使用 select 学号,姓名, case 专业 when '金融系' then '1' when '材料成型及控制工程' then '2' else '3' end from ...
- 11 Hash tables
11 Hash tables Many applications require a dynamic set that supports only the dictionary operatio ...
- select在数据库中有两种含义
select在数据库中有两种意思 (1)是赋值的意思(2)是输出,打印的意思我想你问的大概是赋值吧print和 select在数据库中都有打印输出的意思 用法是:select @aa=select* ...
- 提高SQL查询效率 的10大方法
一.查询条件精确,针对有参数传入情况 二.SQL逻辑执行顺序 FROM–>JOIN–>WHERE–>GROUP–>HAVING–>DISTINCT–>ORDER–& ...