• 进阶实验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
    ",H[k].s);
            k--;
            AdjustDown(H,1,k);//由根结点向下调整成小顶堆
        } else
            printf("EMPTY QUEUE!
    ");
    }
    
    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;
    }
    勤能补拙,熟能生巧
  • 相关阅读:
    CentOS 7下PXE+Kickstart无人值守安装操作系统
    利用pentestbox打造ms17-010移动"杀器"
    XSS测试代码
    sublime Text3基本配置记录+python
    CTF中那些脑洞大开的编码和加密
    信息安全相关资源
    RIP 实验
    python输出有色记录
    下载Chrome商店和Youtube资源
    mysql使用问题记录
  • 原文地址:https://www.cnblogs.com/snzhong/p/12450897.html
Copyright © 2020-2023  润新知