最小堆的优先队列c++代码
时间: 2023-11-04 21:53:16 浏览: 99
最小堆是一种常用的数据结构,可以用来实现优先队列。下面是一个使用C语言实现最小堆优先队列的代码示例:
```c
#include <stdio.h>
#define MAX_SIZE 100
// 最小堆结构
typedef struct {
int heap[MAX_SIZE]; // 存储堆元素的数组
int size; // 当前堆中元素的个数
} MinHeap;
// 初始化最小堆
void initMinHeap(MinHeap* minHeap) {
minHeap->size = 0;
}
// 向最小堆中插入元素
void insert(MinHeap* minHeap, int value) {
if (minHeap->size == MAX_SIZE) {
printf("最小堆已满,无法插入新元素!\n");
return;
}
int i = ++(minHeap->size); // 元素个数加一,i指向新插入的元素位置
while (i > 1 && value < minHeap->heap[i / 2]) {
minHeap->heap[i] = minHeap->heap[i / 2]; // 将父节点下移
i /= 2;
}
minHeap->heap[i] = value; // 插入新元素
}
// 删除最小堆中的最小元素并返回该元素值
int deleteMin(MinHeap* minHeap) {
if (minHeap->size == 0) {
printf("最小堆为空,无法删除最小元素!\n");
return -1;
}
int min = minHeap->heap[1]; // 最小元素即为堆顶元素
int lastValue = minHeap->heap[(minHeap->size)--]; // 取出最后一个元素,size减一
int parent = 1, child = 2; // parent表示当前节点的父节点,child表示当前节点的左子节点
while (child <= minHeap->size) {
// 若右子节点存在且比左子节点小,则用右子节点来比较
if (child < minHeap->size && minHeap->heap[child] > minHeap->heap[child + 1]) {
child++;
}
// 若最后一个元素小于等于当前子节点值,则找到了插入位置,退出循环
if (lastValue <= minHeap->heap[child]) {
break;
}
minHeap->heap[parent] = minHeap->heap[child]; // 将子节点上移
parent = child;
child *= 2;
}
minHeap->heap[parent] = lastValue; // 插入最后一个元素
return min;
}
int main() {
MinHeap minHeap;
initMinHeap(&minHeap);
insert(&minHeap, 5);
insert(&minHeap, 3);
insert(&minHeap, 7);
insert(&minHeap, 1);
printf("删除的最小元素为:%d\n", deleteMin(&minHeap));
return 0;
}
```
阅读全文