优先队列

https://blog.csdn.net/Sungree/article/details/100834974

注意:因为是数组表示(有值的区域里没有空缺),所以这个二叉树是完全二叉树

大顶堆:

C语言代码

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <string.h>
  4 #define Type int
  5 
  6 typedef struct HeapStruct{
  7     int capacity;
  8     int size;
  9     Type* eles;
 10 }PriorityQueue;
 11 
 12 PriorityQueue* Init(int max_size){
 13     PriorityQueue* pq;
 14     if(max_size <= 0){
 15         printf("max_size is illegal !\n");
 16         return NULL;
 17     }
 18     pq = malloc(sizeof(PriorityQueue));
 19     if(pq == NULL){
 20         printf("malloc failed !\n");
 21         return NULL;
 22     }
 23     pq -> eles = malloc((max_size + 1)*sizeof(Type));
 24     if(pq -> eles == NULL){
 25         printf("eles malloc failed !\n");
 26         free(pq);  //如果eles没有malloc成功,记得把pq给释放掉 
 27         return NULL;
 28     }
 29     memset(pq -> eles,0,(max_size + 1)*sizeof(Type));//记得要初始化 
 30     pq -> capacity = max_size;
 31     pq -> size = 0;
 32     return pq;
 33 }
 34 
 35 int is_Empty(PriorityQueue* pq){ //为什么不用bool?因为C语言有些编译器不能用bool 
 36     if(pq == NULL)  return 0;
 37     if(pq -> size == 0)  return 1;
 38     return 0;
 39 }
 40 
 41 int is_Full(PriorityQueue* pq){
 42     if(pq == NULL){
 43       printf("Queue is empty !\n");
 44       return 0;
 45     } 
 46     if(pq -> capacity == pq -> size)  return 1;
 47     return 0;
 48 }
 49 
 50 int push(Type value,PriorityQueue* pq){
 51     if(is_Full(pq)){
 52         printf("Queue is full !\n");
 53         return 0;
 54     }
 55     printf("push %d\n", value);
 56     int i = pq -> size + 1;
 57     for(;i > 1;i /= 2){ //为什么i != 1?因为当i == 1时,i/2 == 0 就越界了 
 58         if(value > pq -> eles[i/2])
 59           pq -> eles[i] = pq -> eles[i/2];
 60         else
 61           break;
 62     }
 63     /*int i;
 64     for(i = pq->size+1; value > pq->eles[i/2] && i>1; i/=2){
 65         pq->eles[i] = pq->eles[i/2];
 66     } */
 67     pq -> eles[i] = value;//不要忘了把空穴补上 
 68     pq -> size ++;
 69     return 1;
 70 }
 71 
 72 int find_max(PriorityQueue* pq,Type* max){
 73     if(is_Empty(pq)){
 74         printf("Queue is empty !\n");
 75         return 0;
 76     }
 77     *max = pq -> eles[1];
 78     return 1;
 79 }
 80 
 81 int pop(PriorityQueue* pq,Type* max){
 82     if(is_Empty(pq)){
 83         printf("Queue is empty !\n");
 84         return 0;
 85     }
 86     *max = pq -> eles[1];
 87     printf("Pop %d\n", pq->eles[1]);
 88     Type last = pq -> eles[pq -> size];
 89     pq -> size --;
 90     if(pq -> size == 0){
 91         pq -> eles[1] = 0;
 92         return 1;
 93     }
 94     int i = 1,maxchild;
 95     for(;2*i <= pq -> size;i = maxchild){    //这里重新调整优先队列和push是一样的,只是push是从下往上,这里是从在最上面往下补
 96         maxchild = 2*i;
 97         if(maxchild < pq -> size)
 98          if(pq -> eles[maxchild] < pq -> eles[maxchild + 1])
 99           maxchild = maxchild + 1;
100         if(last < pq -> eles[maxchild])
101          pq -> eles[i] = pq -> eles[maxchild];
102         else
103          break;
104     }
105     pq -> eles[i] = last;
106     return 1;
107 }
108 
109 int destroy(PriorityQueue* pq){
110     if(pq == NULL)  return 0;
111     free(pq -> eles);
112     pq -> eles = NULL;
113     free(pq);
114     pq = NULL;
115     printf("destroy success !\n");
116     return 1;
117 }
118 
119 int main(int argc, char *argv[]) {
120     //创建容量为6的优先队列 
121     PriorityQueue *pq = Init(6); //init在定义时,定义为指针,因此其返回值是个指针,直接复制给pq 
122     
123     int arr[]={3,4,7,5,8,2,9,10} ;
124     int i = 0;
125     
126     //试图插入多于6个的元素,最后两个元素将无法插入 
127     for(i = 0; i<8; i++){
128         push(arr[i], pq);
129     } 
130     
131     //遍历队列内容
132     printf("the value of pq are: ") ;
133     for(i=0; i<pq->size; i++){
134         printf("%d ", pq->eles[i+1]); 
135     }
136     printf("\n");
137     printf("pq size is %d\n", pq->size);
138     
139     Type max;
140     int size = pq->size;
141     //每次从堆顶取元素
142     for(i=0; i<size; i++){
143         if(find_max(pq, &max)){
144             printf("the max is %d\n", max);
145             pop(pq, &max);
146         }    
147     }
148     printf("new size is %d\n", pq->size) ;
149     
150     //销毁队列 
151     destroy(pq);
152 
153     return 0;
154 }

 

posted @ 2022-07-19 11:14  balabalahhh  阅读(31)  评论(0)    收藏  举报