优先级队列的一种实现

代码:

#include <iostream>

using namespace std;

typedef char Item;
typedef struct QNode *pQNode;
typedef struct QNode
{
	Item data;
	QNode *link;	
}QNode;

typedef struct Queue
{
	pQNode front;
	pQNode rear;
}Queue,*PriorityQueue;

void Copy(Item *dest,Item *src)
{
	*dest = *src;
}

void InitQueue(PriorityQueue* Q);
void Enqueue(PriorityQueue Q,Item item);
void Dequeue(PriorityQueue Q,Item *item);
Item Front(PriorityQueue Q);
bool Isempty(PriorityQueue Q);
void Clear(PriorityQueue *Q);
void PrintQueue(PriorityQueue Q);
void PriorityModify(PriorityQueue Q);



void InitQueue(PriorityQueue* Q)
{
	*Q = new Queue;
	(*Q)->front = NULL;
	(*Q)->rear = NULL;
}
bool Gt(Item a,Item b)
{
	if (a>b)
		return true;
	return false;
}
void PriorityModify(PriorityQueue Q,bool (*Gt)(Item,Item))
{
	if(Isempty(Q))
		return;
	
	pQNode pb = Q->front;
	pQNode pa = pb->link;
	pQNode u,x,t;
	pb->link = NULL;
	while(pa)
	{
		
		if(Gt(pa->data , pb->data))
		{
			/* ">" is applyed if max priority queue is needed here*/
			u = pa->link;
			pa->link = pb;
			pb = pa;
			pa = u; 
		}
		else
		{
			for(t = pb;t->link;t=t->link)
			{
				if(Gt(pa->data,t->link->data)) 
				{
					
					break;
				}	 
			}
			u = t->link;
			x = pa->link;
			t->link = pa;
			pa->link = u;
			pa = x; 				
		}
	}
	Q->front = pb;
	for(t=pb;t->link;t=t->link);
	Q->rear = t;
	
}
void Enqueue(PriorityQueue Q,Item item)
{
	pQNode p = new QNode;
	Copy(&(p->data),&item);
	p->link = NULL;
	if(Q->rear == NULL)
	{
		Q->front = Q->rear = p;
	}
	else
	{
		Q->rear->link = p;
		Q->rear = p;
	}
	
	PriorityModify(Q,&Gt);
}
void Dequeue(PriorityQueue Q,Item *item)
{
	if(!Isempty(Q))
	{
		pQNode p = Q->front;
		Copy(item,&(p->data));
		if (Q->front == Q->rear)
			Q->front = Q->rear = NULL;
		else
			Q->front = Q->front->link;
		delete p;
	}
	
	PriorityModify(Q,&Gt);
	
	
}
Item Front(PriorityQueue Q)
{
	return Q->front->data;
}
bool Isempty(PriorityQueue Q)
{
	return Q == NULL || Q->rear == NULL;
}
void Clear(PriorityQueue *Q)
{
	pQNode  p = (*Q)->front;
	pQNode tmp; 
	while(p)
	{
		tmp = p->link;
		delete p;
		p = tmp;
	}
	delete (*Q);
	(*Q) = NULL;
}
void PrintQueue(PriorityQueue Q)
{
	pQNode p = Q->front;
	cout<<"Queue currently Start:"<<endl;
	while(p)
	{
		cout<<"Qnode : "<<p->data<<endl;
		p = p->link;
	}
	cout<<"Queue End."<<endl;
}

 
int main()
{
	PriorityQueue Q;
	InitQueue(&Q);
	for(int i=0;i<5;i++)
	{
		Enqueue(Q,'A'+8-2*i);
		PrintQueue(Q);
	}
	
	cout<<"Front node of current Queue : "<<Front(Q)<<endl;
	
	cout<<"QNode B Enqueue."<<endl;
	Enqueue(Q,'B');
	PrintQueue(Q);
	
	Item v;
	Dequeue(Q,&v);
	
	cout<<"QNode  :"<<v<<" Dequeued."<<endl;
	PrintQueue(Q);

	for(int i=0;i<5;i++)
		Dequeue(Q,&v);
	cout<<boolalpha<<Isempty(Q)<<endl;
	Clear(&Q);
	cout<<boolalpha<<Isempty(Q)<<endl;

	getchar();
} 
测试输出:

Queue currently Start:
Qnode : I
Queue End.
Queue currently Start:
Qnode : I
Qnode : G
Queue End.
Queue currently Start:
Qnode : I
Qnode : G
Qnode : E
Queue End.
Queue currently Start:
Qnode : I
Qnode : G
Qnode : E
Qnode : C
Queue End.
Queue currently Start:
Qnode : I
Qnode : G
Qnode : E
Qnode : C
Qnode : A
Queue End.
Front node of current Queue : I
QNode B Enqueue.
Queue currently Start:
Qnode : I
Qnode : G
Qnode : E
Qnode : C
Qnode : B
Qnode : A
Queue End.
QNode  :I Dequeued.
Queue currently Start:
Qnode : G
Qnode : E
Qnode : C
Qnode : B
Qnode : A
Queue End.
true
true



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值