ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

pta ds 7-1 Windows消息队列 (25分)

2020-11-07 15:31:54  阅读:267  来源: 互联网

标签:25 Windows pta priority 队列 int child ElementType Data


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

输入格式:

输入首先给出正整数N(≤),随后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!
  作者 DS课程组 单位 浙江大学 代码长度限制 16 KB 时间限制 150 ms 内存限制 64 MB  
#include<stdio.h>
#include<stdlib.h> 
#include<string.h>

#define MAXNUM 10000;

struct message {
    int priority;
    char name[20];
};

typedef struct message ElementType ;
typedef struct HNode *Heap; /* 堆的类型定义 */
typedef Heap MaxHeap;
struct HNode {
    ElementType *Data; /* 存储元素的数组 */
    int Size;          /* 堆中当前元素个数 */
    int Capacity;      /* 堆的最大容量 */
};


MaxHeap CreateHeap(int MaxSize){
    MaxHeap H = NULL;
    H = (MaxHeap)malloc(sizeof(struct HNode));
    H->Capacity = MaxSize;
    H->Data = (ElementType *)malloc(sizeof(ElementType)*(MaxSize+1));
    H->Data[0].priority = MAXNUM;
    H->Size = 0;
    return H;
}

ElementType CreateElement(char *n,int pri)
{
    ElementType M;
    strcpy(M.name,n);
    M.priority = pri;
    return M;
}

bool Insert(MaxHeap H,ElementType X)
{
    if(H->Size == H->Capacity)return 0;
    int i = ++H->Size;
    for( ;H->Data[i/2].priority < X.priority; i/=2){
        H->Data[i] = H->Data[i/2];
    }
    H->Data[i] = X;
    return 1;
}

void DeleteMax(MaxHeap H)
{
    if(H->Size == 0){
        printf("EMPTY QUEUE!\n"); 
    }
    else{
        printf("%s\n",H->Data[1].name);
        int parent , child;
        parent = 1;
        ElementType temp = H->Data[H->Size--];
        for( ;parent*2<=H->Size ; parent = child){
            child = parent * 2;
            if(child!=H->Size&&H->Data[child+1].priority > H->Data[child].priority)
                child++;
            if(temp.priority > H->Data[child].priority)break;
            else H->Data[parent] = H->Data[child];
        }
        H->Data[parent] = temp;
    }
}


int main()
{
    int n;
    scanf("%d",&n);
    MaxHeap H = CreateHeap(n);
    char ops[20];
    char names[20];
    int pri;
    ElementType temp;
    for(int i=0 ; i<n ; i++){
        scanf("%s",ops);
        if(ops[0]=='P')
        {
            scanf("%s",names);
            scanf("%d",&pri);
            Insert(H,CreateElement(names,pri*-1));
        }
        else
        {
            DeleteMax(H);
         } 
        
    }
    return 0;
}

 

 

 

 

标签:25,Windows,pta,priority,队列,int,child,ElementType,Data
来源: https://www.cnblogs.com/xxw1/p/13941146.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有