优先级队列

优先队列

入队循序没有变化,但出队时按优先级出队,优先级高的先出队
出队图示

#include<iostream>
#include<iomanip>

#define MAX_SIZE 5//队列最大容量

using namespace std;

typedef int DataType;  //元素类型

typedef struct _Qnode {//节点结构
	int priority;//优先级
	DataType data;
	struct _Qnode* next;
}Qnode;

typedef Qnode* QnodePrt;

typedef struct Queue {
	int length;//队列长度
	QnodePrt front;//队头指针
	QnodePrt rear;//对尾指针
}LinkQueue;

//初始化
void InItQueue(LinkQueue* LQ) {
	if (!LQ)return;
	LQ->length = 0;
	LQ->front = LQ->rear = NULL;

}
//判断是否为空
int IsEmpty(LinkQueue* LQ) {
	if (!LQ)return 0;
	if (LQ->front == NULL) {
		return 1;
	}
	else {
		return 0;
	}
}
//判断是否已满
 int IsFull(LinkQueue* LQ){
	if (!LQ)return 0;
	if (LQ->length == MAX_SIZE) {
		return 1;
	}
	else {
		return 0;
	}

	}

 //元素入队
 int insertLinkQueue(LinkQueue* LQ, DataType data, int priority) {
	 if (!LQ)return 0;
	 if (IsFull(LQ)) {
		 cout << "元素已满" << endl;
		 return 0;
	 }
	 Qnode* node = new Qnode;
	 node->data = data;
	 node->priority = priority;
	 node->next = NULL;
	 if (IsEmpty(LQ)) {
		 LQ->front = LQ->rear = node;
	 }
	 else {
		 LQ->rear->next = node;
		 LQ->rear = node;
	 }
	 LQ->length++;
	 return 1;
 }
              
 //出队
 int deleteLinkQueue(LinkQueue* LQ, DataType* data) {
	 Qnode** prev = NULL, * prev_node = NULL,//prev二级指针存最高的优先级地址,prev_node存上一个元素地址
		 * last = NULL, * tmp = NULL;//last存自己地址,tmp存下一个元素地址
	 if (!LQ || IsEmpty(LQ)) {
		 cout << "队列为空" << endl;
		 return 0;
	 }
	 if (!data)return 0;

	 prev = &(LQ->front);//将头地址给二级指针
	 cout << "第一个节点的优先级" << (*prev)->priority << endl;
	 last = LQ->front;
	 tmp = last->next;
	 while (tmp) {
		 if (tmp->priority > (*prev)->priority) {
			 cout << "捕捉到更高优先级" <<"\t\t" << tmp->priority << endl;
			 prev = &(last->next);//&(tmp)
			 prev_node = last;
		 }
		 last = tmp;
		 tmp = tmp->next;
	 }
	 *data = (*prev)->priority;
	 tmp = *prev;
	 *prev = (*prev)->next;
	 delete tmp;
	 LQ->length--;

	 //两种特殊情况
	 //首节点长度为0
	 if (LQ->length == 0) {
		 LQ->rear = NULL;
	 }

	 //删掉的为尾结点
	 if (prev_node && prev_node->next == NULL) {
		 LQ->rear = prev_node;
	 }
	 return 1;
 }

 //打印
 void printfLinkQueue(LinkQueue* LQ) {
	 if (!LQ || IsEmpty(LQ)) {
		 cout << "无数据" << endl;
		 return;
	 }
	 QnodePrt tmp;
	 tmp = LQ->front;
	 while (tmp) {
		 cout << setw(4) << tmp->data << "\n\n" << tmp->priority << endl;
		 tmp = tmp->next;
	 }
 }

 int main() {
	 LinkQueue* LQ = new LinkQueue;
	 DataType data;

	 InItQueue(LQ);

	 for (int i = 0; i < 6; i++) {
		 insertLinkQueue(LQ, i, i);
	 }
	 //printfLinkQueue(LQ);

	 for (int i = 0; i < 6; i++) {
		 deleteLinkQueue(LQ,&data);
	 }
	// printfLinkQueue(LQ);
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值