解题思路:
刚开始用单链表,插入排序,超时。
改用建小顶堆。
插入数据时向上调整成小顶堆,输出堆顶元素后,根结点向下调整成小顶堆
#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; }