数据结构——C语言版 优先级队列的实现

优先级队列实现操作包括

//声明优先级队列数据结构

/*初始化优先级队列*/
void QueueInitiate(seqPQueue* Q);


/*优先级队列是否为空*/
//若为空返回0,否则返回1
int QueueNotEmpty(seqPQueue Q);


/*优先级队列入队列*/
//成功返回1,否则返回0
int QueueAppend(seqPQueue* Q, DataType x);


/*删除优先级队列中优先级最高的元素*/
//成功返回1,否则返回0
int QueueDelete(seqPQueue* Q, DataType* x);


/*取优先级队列优先级最高元素*/
//成功返回1,否则返回0
int QueueGet(seqPQueue* Q, DataType* x);

1.结构体定义

//定义队列元素结构体
typedef int ElemType;
typedef struct
{
	int priority;  //定义队列元素优先级
	ElemType elem; //其他内容
}DataType; 

//定义队列结构
typedef struct
{
	DataType Queue[MaxSize];
	int size;
}seqPQueue;

2.初始化优先级队列

/*初始化优先级队列*/
void QueueInitiate(seqPQueue* Q)
{
	Q->size = 0;
}

3.优先级队列是否为空

/*优先级队列是否为空*/
//若为空返回0,否则返回1
int QueueNotEmpty(seqPQueue Q)
{
	if (Q.size > 0)
		return 1;
	else
		return 0;
}

4.优先级队列入队列

/*优先级队列入队列*/
//成功返回1,否则返回0
int QueueAppend(seqPQueue* Q, DataType x)
{
	if (Q->size >= MaxSize)
	{
		printf("队列已满无法插入");
		return 0;
	}
	else
	{
		Q->Queue[Q->size] = x;
		Q->size++;
		return 1;
	}
}

5.删除优先级队列中优先级最高的元素

/*删除优先级队列中优先级最高的元素*/
//成功返回1,否则返回0
int QueueDelete(seqPQueue* Q, DataType* x)
{
	if (Q->size <= 0)
	{
		printf("队列已空无法删除");
		return 0;
	}
	else
	{
		/*数值越小优先级越高*/
		DataType min;        //定义一个变量来接受优先级最高的元素
		int minindex, i;     //minindex用来存优先级最高的元素的下标
		min = Q->Queue[0];   //先假设第一个元素优先级最高
		minindex = 0;        //记下当前优先级最高的元素下标
		for (i = 1; i < Q->size; i++)   //找优先级高的元素先删除
		{
			if (Q->Queue[i].priority < min.priority)
			{
				min = Q->Queue[i];
				minindex = i;
			}
		}
			*x = Q->Queue[minindex];  //将删除的优先级最高的元素由x带回
			for (i = minindex + 1; i < Q->size - 1; i++)
			{
				Q->Queue[i - 1] = Q->Queue[i];  //依次前移
			}
			Q->size--;
			return 1;
	}
}

6.取优先级队列优先级最高元素

/*取优先级队列优先级最高元素*/
//成功返回1,否则返回0
int QueueGet(seqPQueue* Q, DataType* x)
{
	if (Q->size <= 0)
	{
		printf("队列已空无法取元素");
		return 0;
	}
	else
	{
		/*数值越小优先级越高*/
		DataType min;        //定义一个变量来接受优先级最高的元素
		int minindex, i;     //minindex用来存优先级最高的元素的下标
		min = Q->Queue[0];   //先假设第一个元素优先级最高
		minindex = 0;        //记下当前优先级最高的元素下标
		for (i = 1; i < Q->size; i++)   //找优先级高的元素
		{
			if (Q->Queue[i].priority < min.priority)
			{
				min = Q->Queue[i];
				minindex = i;
			}
		}
		*x = Q->Queue[minindex];  //将的优先级最高的元素由x带回
		return 1;
	}
}

程序测试如下

#include<stdio.h>
#include"seqpqueue.h"

int main()
{
	seqPQueue Queue;
	int i,a;
	DataType x;
	QueueInitiate(&Queue);
	for ( i = 0; i<MaxSize; i++)
	{
		x.priority = MaxSize - i;
		QueueAppend(&Queue,x);
	}
	for (i = 0; i < MaxSize; i++)
		printf("%d  ", Queue.Queue[i]);
	printf("\n");
	QueueGet(&Queue, &a);
	printf("当前优先级最高的元素为%d\n", a);
	while (QueueNotEmpty(Queue))
	{
		QueueDelete(&Queue, &a);
		printf("%d  ", a);
	}
}

程序运行结果如下

 

  • 2
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值