优先级队列
优先级队列是带有优先级的队列,普通的队列是从队尾进数据,从队头出数据,而优先级队列入数据一样,不过出数据的时候是根据数据的优先级从高到低进行出数据,这种数据类型适用于一些文件管理的软件,优先级队列的使用也会加快工作效率,相比于一般队列,优先级队列也不会出现假溢出的问题。
下面是实现代码
typedef struct
{
int priority; //优先级
ElemType elem; //其他内容
}DataType;
typedef struct
{
DataType queue[Maxsize]; //队列数组
int size; //元素个数
}SeqPQueue; //优先级队列结构体
void QueueInitiate(SeqPQueue *Q)
{
Q->size=0; //定义初始元素个数
}
int QueueNotEmpty(SeqPQueue Q)//判断优先级队列是否非空
{
if(Q.size <=0)
return 0;
else
return 1;
}
int QueueAppend(SeqPQueue *Q,DataType x)
{
if(Q->size >=Maxsize)
{
printf("队列已满无法插入");
return 0;
}
else //把数据元素值x插入队列的队尾,成功返回1,失败返回0
{
Q->queue[Q->size]=x;
Q->size++;
return 1;
}
}
int QueueDelete(SeqPQueue *Q,DataType *d)
{ //删除队列中优先级最高的元素并且赋给d,成功返回1,失败返回0
DataType min;
int minIndex,i;
if(Q->size<0)
{
printf("队列已空无法出数据");
return 0;
}
else
{
min=Q->queue[0]; //初始选queue[0]为优先级最高的元素
minIndex=0; //minIndex为优先级最高的元素下标
for(i=1;i<Q->size;i++) //寻找优先级最高元素对应下标
if(Q->queue[i].priority<min.priority)//选择比较法找出最大优先级的元素
{
min=Q->queue[i];
minIndex=i;
*d=Q->queue[minIndex]; //找到的优先级最高的元素
for(i=minIndex;i<Q->size;i++)//数据元素依次前移
Q->queue[i-1]=Q->queue[i];
Q->size--; //元素个数减1
return 1;
}
}
int QueueGet(SeqPQueue *Q,DataType *d)
//取优先级最高的元素并且赋值给d,成功则返回1,失败则返回0
{
DataType min;
int minIndex,i;
if(Q->size<=0)
{
printf("队列已空无数据可取");
return 0;
}
else
{
min=Q->queue[0]; //初始选queue[0]为优先级最高的元素
minIndex=0; //minIndex为优先级最高的元素的下标
for(i=1;i<Q->size;i++)//寻找优先级最高的元素对应的下标
{
if(Q->queue[i].priority<min.priority)
{
min=Q->queue[i];
minIndex=i;
}
*d=Q->queue[minIndex]; //找到的优先级最高的元素
return 1;
}
}