在C语言中,要使用优先队列(priority queue),你需要使用堆(heap)数据结构来实现。堆是一种特殊的二叉树,具有以下性质:
在C语言中,可以使用数组来表示二叉堆。对于大根堆,数组中的每个元素都比其子节点的值要大;对于小根堆,数组中的每个元素都比其子节点的值要小。
以下是C语言中使用优先队列的一般步骤:
#define MAX_SIZE 100
typedef struct {
int data[MAX_SIZE];
int size;
} PriorityQueue;
void insert(PriorityQueue* queue, int value) {
if (queue->size >= MAX_SIZE) {
printf("Priority queue is full.\n");
return;
}
// 插入新元素到堆的最后
int i = queue->size;
queue->data[i] = value;
// 调整堆,确保满足堆的性质
while (i > 0 && queue->data[i] > queue->data[(i - 1) / 2]) {
// 交换当前节点和父节点的值
int temp = queue->data[i];
queue->data[i] = queue->data[(i - 1) / 2];
queue->data[(i - 1) / 2] = temp;
i = (i - 1) / 2; // 更新当前节点的索引
}
queue->size++; // 更新堆的大小
}
int deleteMax(PriorityQueue* queue) {
if (queue->size == 0) {
printf("Priority queue is empty.\n");
return -1; // 表示空值或错误
}
int max = queue->data[0]; // 保存堆顶元素
queue->size--; // 更新堆的大小
// 将最后一个元素移动到堆顶
queue->data[0] = queue->data[queue->size];
// 调整堆,确保满足堆的性质
int i = 0;
while (2 * i + 1 < queue->size) {
int left = 2 * i + 1; // 左子节点的索引
int right = 2 * i + 2; // 右子节点的索引
int largest = i; // 最大值的索引
// 找到较大的子节点
if (left < queue->size && queue->data[left] > queue->data[largest]) {
largest = left;
}
if (right < queue->size && queue->data[right] > queue->data[largest]) {
largest = right;
}
if (largest == i) {
break; // 已经满足堆的性质,退出循环
}
// 交换当前节点和较大子节点的值
int temp = queue->data[i];
queue->data[i] = queue->data[largest];
queue->data[largest] = temp;
i = largest; // 更新当前节点的索引
}
return max;
}
int main() {
PriorityQueue queue;
queue.size = 0;
insert(&queue, 5);
insert