优先级队列的概念
优先级队列就是带有优先级的队列,队列中的每一个元素都有对应的优先级,出队列的时候首先选择优先级最高的元素出队列,当元素的优先级相同的时候,按照先进先出的原则出队列,因此,优先级队列与一般队列主要的区别是出队的操作不同。
优先级队列按照存储结构的不同分为顺序优先级队列和链式优先级队列,本文中的代码为顺序优先级队列的实现代码。
(1)顺序优先级队列的结构体设计
#include <stdio.h>
#include <stdlib.h>
#define ElemType int
#define MaxQueueSize 20
typedef struct /*定义一个队列数据元素结构体*/
{
int priority; /*定义数据元素的优先级*/
ElemType elem; /*其他数据元素*/
}DataType;
typedef struct /*定义一个队列结构体*/
{
DataType queue[MaxQueueSize]; /*队列数组*/
int size; /*队列的长度*/
}SeqPQueue;
注:一般队列需要设置队头指针和队尾指针方便元素出入队列以及判断队列空与满,而优先级队列是采用优先级来控制元素出队列,因此不需要设置队头与队尾指针
(2)队列的初始化
void QueueInit(SeqPQueue *Q)
{
Q->size=0;
}
(3)判断优先级队列是否为空
int QueueNotEmpty(SeqPQueue Q)
{
if(Q.size<=0)
{
printf("优先级队列为空 \n");
return 0;
}
else return 1;
}
(4)把数据元素值x从优先级队列Q的尾部插入队列
int InsertAppend(SeqPQueue *Q,DataType x)
{
if(Q->size>=MaxQueueSize) /*判断优先级队列是否已满*/
{
printf("优先级队列已满,无法插入元素 \n");
return 0;
}
else
{
Q->queue[Q->size]=x; /*赋值*/
Q->size++; /*队列元素个数+1*/
return 1;
}
}
(5)出队列(删除元素)
int QueueDelete(SeqPQueue *Q,DataType *d)
{
DataType min;
int minIndex,i;
if(Q->size<=0)
{
printf("优先级队列为空,无法删除元素"); /*判断优先级队列是否为空*/
return 0;
}
else
{
min=Q->queue[0];
minIndex=0; /*初始化下标为0处的优先级最高*/
for(i=1;i<Q->size;i++)
{
if(Q->queue[i].priority<min.priority) /*遍历优先级队列寻找优先级最高的元素*/
{
min=Q->queue[i]; /*将优先级最高的元素的值赋值给min*/
minIndex=i; /*将优先级最后高的元素的下标赋给minIndex*/
}
}
*d=Q->queue[minIndex]; /*找到优先级最高的元素*/
for(i=minIndex+1;i<Q->size;i++) /*数据元素依次前移*/
{
Q->queue[i-1]=Q->queue[i];
}
Q->size--; /*队列的长度-1*/
return 1;
}
}
注:此处用最小的值表示最高的优先级
(6)取优先级队列中优先级最高的元素并赋值给d,成功则返回1,失败则返回0
int QueueGet(SeqPQueue *Q,DataType *d)
{
DataType min;
int i,minIndex;
if(Q->size<=0)
{
printf("队列为空,无元素可取 \n");
return 0;
}
else
{
min=Q->queue[0];
minIndex=0;
for(i=1;i<Q->size;i++)
{
if(Q->queue[i].priority<Q->queue[0].priority)
{
min=Q->queue[i];
minIndex=i;
}
}
*d=Q->queue[minIndex]; /*通过指针的方式传递优先级队列中优先级最高的元素的值*/
return 1;
}
}