进阶实验4-3.2 Windows消息队列 (25分)--建堆

 

 

 

 解题思路:

刚开始用单链表,插入排序,超时。

改用建小顶堆。

插入数据时向上调整成小顶堆,输出堆顶元素后,根结点向下调整成小顶堆

#include <stdio.h>
#include <string.h>
#include <malloc.h>
#define MAX 11
typedef struct {
    int ID;
    char s[MAX];
} Msg;
Msg H[100001];
void AdjustUp(Msg H[],int k) {//向上调整成小顶堆
    H[0]=H[k];
    int i=k/2;
    while(i>0&&H[i].ID>H[0].ID) {
        H[k]=H[i];
        k=i;
        i=k/2;
    }
    H[k]=H[0];
}
void AdjustDown(Msg H[],int k,int n) {//向下调整成小顶堆
    H[0]=H[k];
    int i;
    for(i=k*2; i<=n; i*=2) {
        if(i<n&&H[i].ID>H[i+1].ID)
            i++;
        if(H[0].ID<=H[i].ID)break;
        else {
            H[k]=H[i];
            k=i;
        }

    }
    H[k]=H[0];
}
int k=0;
void put() {//插入数据
    int x;
    char c[MAX];
    scanf("%s %d",c,&x);
    H[++k].ID=x;
    strcpy(H[k].s,c);
    AdjustUp(H,k);
}
void get() {//获取堆顶元素
    if(k) {
        Msg tmp=H[1];//交换堆顶元素和最后一个元素的位置,再输出最后一个元素
        H[1]=H[k];
        H[k]=tmp;
        printf("%s\n",H[k].s);
        k--;
        AdjustDown(H,1,k);//由根结点向下调整成小顶堆
    } else
        printf("EMPTY QUEUE!\n");
}

int main() {
    int n;
    scanf("%d",&n);
    int i,x;
    char c[MAX];
    for(i=0; i<n; i++) {
        scanf("%s",c);
        if(!strcmp(c,"PUT")) {
            put();
        } else if(!strcmp(c,"GET")) {
            get();
        }
    }
    return 0;
}

 

posted @ 2020-03-09 20:40  跃鱼  阅读(290)  评论(0编辑  收藏  举报