zoukankan      html  css  js  c++  java
  • 进阶实验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;
    }
    勤能补拙,熟能生巧
  • 相关阅读:
    117. 填充每个节点的下一个右侧节点指针 II
    116. 填充每个节点的下一个右侧节点指针
    114. 二叉树展开为链表
    9.5 NLP slide: 第二课 语言模型
    165. 比较版本号
    143. 重排链表
    147. 对链表进行插入
    127. 单词接龙
    129. 求根到叶子节点数字之和
    95. 不同的二叉搜索树 II 递归
  • 原文地址:https://www.cnblogs.com/snzhong/p/12450897.html
Copyright © 2011-2022 走看看