优先队列的用法c++
时间: 2023-09-04 18:08:23 浏览: 74
优先队列是一种特殊的队列数据结构,其中每个元素都有一个相关的优先级。在优先队列中,元素按照优先级的顺序被移出。具有最高优先级的元素最先被移出。
在C语言中,可以使用标准库中的堆来实现优先队列。下面是一个示例代码,演示了优先队列的基本用法:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int priority;
int data;
} Node;
typedef struct {
Node *nodes;
int size;
int capacity;
} PriorityQueue;
PriorityQueue* createPriorityQueue(int capacity) {
PriorityQueue *queue = (PriorityQueue*)malloc(sizeof(PriorityQueue));
queue->nodes = (Node*)malloc(capacity * sizeof(Node));
queue->size = 0;
queue->capacity = capacity;
return queue;
}
void enqueue(PriorityQueue *queue, int priority, int data) {
if (queue->size == queue->capacity) {
printf("Priority queue is full.\n");
return;
}
Node newNode = { priority, data };
int i = queue->size;
// 找到新元素应该插入的位置
while (i > 0 && queue->nodes[(i - 1) / 2].priority < newNode.priority) {
queue->nodes[i] = queue->nodes[(i - 1) / 2];
i = (i - 1) / 2;
}
queue->nodes[i] = newNode;
queue->size++;
}
Node dequeue(PriorityQueue *queue) {
if (queue->size == 0) {
printf("Priority queue is empty.\n");
Node emptyNode = { 0, 0 };
return emptyNode;
}
Node root = queue->nodes[0];
Node lastNode = queue->nodes[queue->size - 1];
queue->size--;
int i = 0;
int child = 1;
// 找到下一个根节点
while (child < queue->size) {
// 找到较大的子节点
if (child + 1 < queue->size && queue->nodes[child + 1].priority > queue->nodes[child].priority) {
child++;
}
if (lastNode.priority >= queue->nodes[child].priority) {
break;
}
// 将子节点移动到根节点
queue->nodes[i] = queue->nodes[child];
i = child;
child = 2 * child + 1;
}
queue->nodes[i] = lastNode;
return root;
}
int main() {
PriorityQueue *queue = createPriorityQueue(10);
enqueue(queue, 3, 30);
enqueue(queue, 1, 10);
enqueue(queue, 2, 20);
Node node1 = dequeue(queue);
printf("Priority: %d, Data: %d\n", node1.priority, node1.data);
Node node2 = dequeue(queue);
printf("Priority: %d, Data: %d\n", node2.priority, node2.data);
Node node3 = dequeue(queue);
printf("Priority: %d, Data: %d\n", node3.priority, node3.data);
return 0;
}
```
该示例代码使用堆实现了优先队列,具体的操作包括创建优先队列、入队操作(enqueue)、出队操作(dequeue)。在示例中,元素的优先级通过整数值表示,数值越大表示优先级越高。你可以根据自己的需要修改数据结构和操作函数来适应不同的场景。
阅读全文