优先队列 STL 实现

优先队列:顾名思义,首先它是一个队列,但是它强调了“优先”二字,所以,已经不能算是一般意义上的队列了,它的“优先”意指取队首元素时,有一定的选择性,即根据元素的属性选择某一项值最优的出队~

说到队列,我们首先想到就是先进先出,后进后出;那么何为优先队列呢,在优先队列中,元素被赋予优先级,当访问元素时,具有最高级优先级的元素先被访问。即优先队列具有最高级先出的行为特征。

优先队列在头文件#include <queue>中;

其声明格式为:priority_queue <int> ans;//声明一个名为ans的整形的优先队列

基本操作有:

empty( )  //判断一个队列是否为空

pop( )  //删除队顶元素

push( )  //加入一个元素

size( )  //返回优先队列中拥有的元素个数

top( )  //返回优先队列的队顶元素


优先队列的时间复杂度为O(logn),n为队列中元素的个数,其存取都需要时间。


在默认的优先队列中,优先级最高的先出队。默认的int类型的优先队列中先出队的为队列中较大的数。


然而更多的情况下,我们是希望可以自定义其优先级的,下面介绍几种常用的定义优先级的操作:



#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int tmp[100];
struct cmp1
{
     bool operator ()(int x, int y)
    {
        return x > y;//小的优先级高
    }
};
struct cmp2
{
    bool operator ()(const int x, const int y)
    {
        return tmp[x] > tmp[y]; 
        //tmp[]小的优先级高,由于可以在队外改变队内的值,
        //所以使用此方法达不到真正的优先,建议用结构体类型。
    }
};
struct node
{
    int x, y;
    friend bool operator < (node a, node b)
    {
        return a.x > b.x;//结构体中,x小的优先级高
    }
};

priority_queue<int>q1;//大的优先
priority_queue<int, vector<int>, cmp1>q2; //小的优先
priority_queue<int, vector<int>, cmp2>q3; //下标对应的值小的优先
priority_queue<node>q4; //结构体中对应值小的优先
int main()
{
    int i,j,k,m,n;
    int x,y;
    node a;
    while(cin>>n)
    {
        for(int i=0;i<n;i++)
        {
            cin>>a.y>>a.x;
            q4.push(a);
        }
        cout << endl;
        while(!q4.empty())
        {
            cout<<q4.top().y <<" "<<q4.top().x<<endl;
            q4.pop();
        }
        cout << endl;
    }
    return 0;
}



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
优先队列是一种特殊的队列,可以根据元素的优先级自动排序,最常见的实现方式是使用堆(heap)。以下是一个使用堆实现优先队列的示例代码: ```c++ #include <iostream> #include <vector> using namespace std; class PriorityQueue { public: PriorityQueue() {} void push(int val) { heap.push_back(val); int idx = heap.size() - 1; while (idx > 0 && heap[idx] > heap[(idx - 1) / 2]) { swap(heap[idx], heap[(idx - 1) / 2]); idx = (idx - 1) / 2; } } void pop() { int lastIdx = heap.size() - 1; swap(heap[0], heap[lastIdx]); heap.pop_back(); int idx = 0; while (2 * idx + 1 < heap.size()) { int maxChildIdx = 2 * idx + 1; if (maxChildIdx + 1 < heap.size() && heap[maxChildIdx + 1] > heap[maxChildIdx]) { maxChildIdx++; } if (heap[idx] < heap[maxChildIdx]) { swap(heap[idx], heap[maxChildIdx]); idx = maxChildIdx; } else { break; } } } int top() { return heap[0]; } bool empty() { return heap.empty(); } private: vector<int> heap; }; ``` 在这个实现中,我们使用一个动态数组来存储队列中的元素,然后通过堆的方式来维护元素的优先级顺序。具体来说,我们使用一个大根堆来实现优先队列,每次插入元素时,我们将其插入到堆的末尾,然后不断将其与其父节点比较,如果比父节点优先级高,则交换位置,直到找到合适的位置。删除元素时,我们将堆顶元素与最后一个元素交换位置,然后弹出最后一个元素,最后不断将堆顶元素与其子节点比较,如果比子节点优先级低,则交换位置,直到找到合适的位置。获取队列首元素时,直接返回堆顶元素即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值