简介
- 优先队列的队首元素总是整个队列中的最大值或最小值,故可以用构造堆的思想来实现。
- 实现了以下功能:
- push,添加元素
- pop,删除队首元素
- top,查看队首元素
code
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define QSIZE 1024
typedef struct{
int data[QSIZE];
int count;
}p_queue_t;
int p_queue_size(p_queue_t *queue){
return queue->count;
}
int p_queue_size_add(p_queue_t *queue){
queue->count++;
return 0;
}
int p_queue_size_sub(p_queue_t *queue){
queue->count--;
return 0;
}
int p_queue_qush(p_queue_t *queue, int data){
int count = p_queue_size(queue);
int idx_father;
while (count > 0)
{
idx_father = count / 2;
if (queue->data[idx_father] <= data)
{
break;
}
queue->data[count] = queue->data[idx_father];
count = idx_father;
}
queue->data[count] = data;
p_queue_size_add(queue);
return 0;
}
int p_queue_pop(p_queue_t *queue){
int end = p_queue_size(queue);
int ret = queue->data[0];
int data, idx, idx_l, idx_r, idx_min;
if(end == 0){
return -1;
}
if(end == 1){
p_queue_size_sub(queue);
return 0;
}
end = end - 1;
data = queue->data[end];
idx = 0;
while(idx * 2 + 1 <= end){
idx_l = idx * 2 + 1;
idx_r = idx * 2 + 2;
idx_min = idx_l;
if(idx_r < end && queue->data[idx_r] < queue->data[idx_min]){
idx_min = idx_r;
}
if(queue->data[idx_min] >= data){
break;
}
queue->data[idx] = queue->data[idx_min];
idx = idx_min;
}
queue->data[idx] = data;
p_queue_size_sub(queue);
return ret;
}
int p_queue_top(p_queue_t *queue){
int idx = p_queue_size(queue);
if(idx == 0){
return -1;
}
return queue->data[0];
}
int main(){
p_queue_t queue;
int i;
memset(&queue, 0, sizeof(queue));
for(i = 0; i < 128; i++){
p_queue_qush(&queue, random() % 10);
}
for(i = 0; i < p_queue_size(&queue); i++){
printf("%d ", queue.data[i]);
}
printf("\n");
p_queue_pop(&queue);
for(i = 0; i < p_queue_size(&queue); i++){
printf("%d ", queue.data[i]);
}
printf("\n");
exit(0);
}
测试结果