-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathbq_heap_queue.cpp
More file actions
102 lines (76 loc) · 2.32 KB
/
Copy pathbq_heap_queue.cpp
File metadata and controls
102 lines (76 loc) · 2.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include <stdlib.h>
#include <stdio.h>
#include "header.h"
#include "boolean_queue.h"
using namespace std;
// Implemnt a heap queue.
bq_priority_queue bq_pq_initialize(int maxelements) {
bq_priority_queue queue;
if (maxelements < BQ_PQ_MIN_SIZE)
maxelements = BQ_PQ_MIN_SIZE;
queue = new bq_heap_struct_t;
if (queue == NULL){
fprintf(stderr, "Out of space\n");
return NULL;
}
queue->elements = new bq_pq_element_type[maxelements + 1];
if (queue->elements == NULL){
fprintf(stderr, "Out of space\n");
return NULL;
}
queue->capacity = maxelements;
queue->size = 0;
queue->elements[ 0 ] = NULL;
return queue;
}
void bq_pq_make_empty(bq_priority_queue queue) {
queue->size = 0;
}
void bq_pq_insert(bq_pq_element_type X, bq_priority_queue queue) {
int i;
if (bq_pq_is_full(queue)) {
fprintf(stderr, "Priority queue is full\n");
return;
}
for (i = ++queue->size; i / 2 > 0 && queue->elements[ i / 2 ]->top > X->top; i /= 2)
queue->elements[ i ] = queue->elements[ i / 2 ];
queue->elements[ i ] = X;
}
bq_pq_element_type bq_pq_delete_min(bq_priority_queue queue) {
int i, child;
bq_pq_element_type minelement, lastelement;
if (bq_pq_is_empty(queue)) {
fprintf(stderr, "Priority queue is empty\n");
return queue->elements[ 0 ];
}
minelement = queue->elements[ 1 ];
lastelement = queue->elements[ queue->size-- ];
for (i = 1; i * 2 <= queue->size; i = child) {
child = i * 2;
if (child != queue->size && queue->elements[ child + 1 ]->top
< queue->elements[ child ] -> top)
child++;
if (lastelement->top > queue->elements[ child ]->top)
queue->elements[ i ] = queue->elements[ child ];
else
break;
}
queue->elements[ i ] = lastelement;
return minelement;
}
bq_pq_element_type bq_pq_find_min(bq_priority_queue queue) {
if (!bq_pq_is_empty(queue))
return queue->elements[ 1 ];
fprintf(stderr, "Priority queue is empty\n");
return queue->elements[ 0 ];
}
int bq_pq_is_empty(bq_priority_queue queue) {
return queue->size == 0;
}
int bq_pq_is_full(bq_priority_queue queue) {
return queue->size == queue->capacity;
}
void bq_pq_destroy(bq_priority_queue queue) {
free(queue->elements);
free(queue);
}