c++怎么自己实现一个优先队列
时间: 2023-10-19 08:08:48 浏览: 103
要实现一个优先队列,可以使用堆这种数据结构来实现。堆分为最大堆和最小堆两种类型,最大堆的每个节点的值都大于或等于其子节点的值,最小堆的每个节点的值都小于或等于其子节点的值。
在 C 语言中,可以使用数组来表示一个堆,其中第一个元素为根节点。对于一个最大堆,可以使用下面的代码来实现:
```
#define MAX_SIZE 100
int heap[MAX_SIZE];
int size = 0;
void swap(int *a, int *b) {
int tmp = *a;
*a = *b;
*b = tmp;
}
void push(int val) {
heap[++size] = val; // 加入新元素
int cur = size;
while (cur > 1 && heap[cur] > heap[cur/2]) { // 维护最大堆性质
swap(&heap[cur], &heap[cur/2]);
cur /= 2;
}
}
int pop() {
int res = heap[1]; // 取出根节点
heap[1] = heap[size--]; // 将最后一个元素赋值给根节点并删除最后一个元素
int cur = 1;
while (cur * 2 <= size) { // 维护最大堆性质
int child = cur * 2;
if (child + 1 <= size && heap[child+1] > heap[child]) {
child++;
}
if (heap[child] > heap[cur]) {
swap(&heap[cur], &heap[child]);
cur = child;
} else {
break;
}
}
return res;
}
```
在这个代码中,`push` 函数用于将新元素加入堆中,而 `pop` 函数用于取出堆中的根节点。我们可以通过不断调用 `push` 函数将元素加入堆中,并通过不断调用 `pop` 函数来取出堆中的元素,实现优先队列的功能。
需要注意的是,由于我们使用了数组来表示堆,因此在实现时需要注意数组越界的问题。此外,这个代码中实现的是最大堆,如果需要实现最小堆,只需要将 `push` 函数和 `pop` 函数中的比较符号改为 `<` 即可。
阅读全文
相关推荐
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![-](https://img-home.csdnimg.cn/images/20241231044955.png)
![-](https://img-home.csdnimg.cn/images/20241231044833.png)
![-](https://img-home.csdnimg.cn/images/20250102104920.png)
![-](https://img-home.csdnimg.cn/images/20241231045021.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)