实验案例4-4:windows消息队列(堆的应用)

来源:互联网 发布:算法导论 高清pdf 编辑:程序博客网 时间:2024/05/22 06:39

PUT为把消息加入队列,后为消息的优先级
GET为从消息队列中取出优先级最高的队列
输入样例:
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>#define MAXN 100000#define MAXS 10typedef struct Message{    char msg[MAXS+1];    int p;}ElementType;typedef struct HeapStruct* MinHeap;struct HeapStruct{    ElementType* Elements; //这里不可为Elements[size]     int size;//堆的大小 }; MinHeap create(int maxsize){    MinHeap H=malloc(sizeof(struct HeapStruct));    H->Elements=malloc(sizeof(struct Message)*(maxsize+1));//堆中maxsize+1个元素,i=0起哨兵作用,比所有可能的值都小,                                                            //第一个元素为i=1,最后一个为i=size,                                                            //节点i的子节点分别是2*i,2*i+1     H->size=0;    H->Elements[0].p=-1;    return H;}void insert(MinHeap H,ElementType X){    int i;    for(i=++H->size;H->Elements[i/2].p>X.p;i/=2){        H->Elements[i].p=H->Elements[i/2].p;        strcpy(H->Elements[i].msg,H->Elements[i/2].msg);    }    H->Elements[i].p=X.p;    strcpy(H->Elements[i].msg,X.msg);}ElementType deleteMin(MinHeap H){    int parent,child;    ElementType minx,tmp;    if(!H->size){        minx.p=-1;        return minx;    }    minx.p=H->Elements[1].p;    strcpy(minx.msg,H->Elements[1].msg);    tmp.p=H->Elements[H->size].p;    strcpy(tmp.msg,H->Elements[H->size--].msg);    for(parent=1;2*parent<=H->size;parent=child){        child=2*parent;        if(child!=H->size&&H->Elements[child].p>H->Elements[child+1].p) child++;        if(tmp.p<=H->Elements[child].p) break;        else{            H->Elements[parent].p=H->Elements[child].p;            strcpy(H->Elements[parent].msg,H->Elements[child].msg);        }    }    H->Elements[parent].p=tmp.p;    strcpy(H->Elements[parent].msg,tmp.msg);    return minx;    }int main(){    int N,i;    char cmd[4];    MinHeap H;    ElementType X;    scanf("%d\n",&N);    H=create(N);    for(i=0;i<N;i++){        scanf("%s",cmd);        if(cmd[0]=='P'){            scanf("%s %d\n",X.msg,&X.p);            insert(H,X);        }else{            X=deleteMin(H);            if(X.p==-1) printf("EMPTY QUEUE!\n");            else printf("%s\n",X.msg);        }    }    return 0;}
0 0
原创粉丝点击