您的位置:首页 > 其它

优先队列

2015-06-21 12:59 316 查看
           优先队列

   原始的队列遵循先进先出,队列尾入队列,队头出队列。而优先队列出队列的是优先级最高的那个元素(该优先级次序自己设定),而入队时自动按该优先级顺序插入(插入后调整)。

   注意:优先队列利用到堆排序的知识,最好先学堆排序。。。额,没学也没多大事。。。。。

下面给出我用c++写的优先队列的各功能实现。。。

  

#include<stdio.h>
#include<string>
#include<iostream>
using namespace std;
#define Max 10000
//队列元素自己设定
typedef struct node
{
int key;
//下面就是优先顺序的设定
bool friend operator < (const node &a,const node &b)
{
return a.key < b.key;
}
}Node;
//优先队列各项功能实现
class PQueue
{
private:
Node v[Max];
int length;
void heap_adjust(int l,int r)    //堆排序的核心(调整)
{
int j=l<<1;
Node tmp=v[l];
while(j<=r)
{
if(j<r&&v[j]<v[j+1]) j++;
if(tmp<v[j]) v[l]=v[j];
else break;
l=j;
j<<=1;
}
v[l]=tmp;
}
public:
PQueue()
{
length=0;
}
//堆排序部分
void creat_heap()
{
for(int i=length>>1;i>0;i--)
heap_adjust(i,length);
}
void set_size(int len)
{
length=len;
}
//如果不用下面的两个函数进行直接赋值或排序,就不需要特地调用creat_heap()函数
void set_value(int i,Node value)
{
v[i]=value;
}
void heap_sort()
{
for(int i=length;i>1;i--)
{
Node tmp=v[i];
v[i]=v[1];
v[1]=tmp;
heap_adjust(1,i-1);
}
}
bool Is_heap()
{
int j;
if(length<=1) return true;
for(int i=length>>1;i>0;i--)
{
j=i<<1;
if(j<length&&v[j]<v[j+1]) j++;
if(v[i]<v[j]) return false;
}
return true;
}
//重头戏,优先队列的入队列和出队列
bool Is_empty()
{
return length==0;
}
bool Is_full()
{
return length==Max-1;
}
bool push(Node value)
{
if(Is_full()) return false;
v[++length]=value;
int i=length;
int j=length>>1;
while(j>0)
{
if(!(v[j]<v[i])) break;
Node tmp=v[i];
v[i]=v[j];
v[j]=tmp;
i=j;
j>>=1;
}
return true;
}
bool pop()
{
if(Is_empty()) return false;
Node tmp=v[1];
v[1]=v[length];
v[length]=tmp;
length--;
heap_adjust(1,length);
return true;
}
bool pop(Node &value)
{
if(Is_empty()) return false;
Node tmp=v[1];
v[1]=v[length];
v[length]=tmp;
value=v[length];
length--;
heap_adjust(1,length);
return true;
}
bool top(Node &value)
{
if(Is_empty()) return false;
value=v[1];
return true;
}
int size()
{
return length;
}
};
int main()
{

return 0;
}


View Code

  下面给出一道优先队列的基础题:

  http://codeforces.com/contest/129/problem/D

  这道题的解题用到优先队列,而且是最基本的暴力。

   在c++中,有priority_queue,可以直接用它定义一个优先队列,用法先写一个想要的队列元素的数据结构(也可以是int等基本数据类型),定义好优先级别,就可以使用了: priority_queue<Node> a;

  具体用法百度吧。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: