我们知道普通队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。
在某些情况下,我们可能需要找出队列中的最大值或者最小值,例如使用一个队列保存计算机的任务,一般情况下计算机的任务都是有优先级的,我
们需要在这些计算机的任务中找出优先级最高的任务先执行,执行完毕后就需要把这个任务从队列中移除。
普通的队列要完成这样的功能,需要每次遍历队列中的所有元素,比较并找出最大值,效率不是很高,这个时候,我们就可以使用一种特殊的队列来完成这种需求,优先队列。
优先队列的底层是用堆实现的,因为堆顶就是最大元素。
在优先队列中默认存放数据的容器是vector,在声明时也可以用deque(双向队列)
#ifndef priority_queue
#define priority_queue
using namespace std;
template <class Ty, class Container = vector<Ty>, class Compare = less<typename Container::value_type> >
class priorityQueue
{
public:
typedef Container container_type;
typedef typename Container::value_type value_type;
typedef typename Container::size_type size_type;
typedef typename Container::reference reference;
typedef typename Container::const_reference const_reference;
//直接构造一个空的优先队列
priorityQueue():c(), comp(){}//默认比较方法, 默认容器vector
priorityQueue(const Compare& pred):c(), comp(pred){}//指定比较方法, 默认容器vector
priorityQueue(const Container& Cont, const Compare comps):c(Cont), comp(comps){}////指定比较方法, 指定容器Cont
//使用容器的迭代器来将容器中数据构造成优先队列
template <class Iterator>
priorityQueue(Iterator first, Iterator last):c(first, last), comp(){
//将该容器的数据先放到默认的vector容器c中,
//使用默认的比较方法less
make_heap(c.begin(), c.end(), comp);
}
template <class Iterator>
priorityQueue(Iterator first, Iterator last, const Compare& comps):c(first, last), comp(comps){
//将该容器的数据先放到默认的vector容器c中,
//使用特定的比较方法comps
make_heap(c.begin(), c.end(), comp);
}
template <class Iterator>
priorityQueue(Iterator first, Iterator last, const Compare& comps, const Container& Cont):c(Cont), comp(comps){
//将该容器的数据先放到指定的的comps容器c中,
//使用特定的比较方法comps
c.insert(c.end(), first, last);
make_heap(c.begin(), c.end(), comp);
}
bool isempty(){
return c.empty();
}
size_type size(){
return c.size();
}
reference top(){
return c.front();
}
void push(value_type& value){
c.push_back(value);
make_heap(c.begin(), c.end(), comp);
}
void pop(){
pop_heap(c.begin(), c.end(), comp);
c.pop_back();
}
private:
Container c;//容器类vector
Compare comp;//比较方法
};
#endif // priority_queue
int main()
{
int i,number[20]={29,23,20,22,17,15,26,51,19,12,35,40};
priorityQueue<int, deque<int>> a;
for(i=0;i<12;i++)
a.push(number[i]);
for(i=0;i<12;i++)
cout<<number[i]<<",";
cout << endl;
cout << a.size() <<endl;
while(!a.isempty()){
cout << a.top() <<",";
a.pop();
}
cout << endl;
//make_heap(&number[0], &number[12]);
return 0;
}