数据结构--队列

队列(queue)是一种具有「先进入队列的元素一定先出队列」性质的表。由于该性质,队列通常也被称为先进先出(first in first out)表,简称 FIFO 表。

C++ STL 中实现了 队列 std::queue优先队列 std::priority_queue 两个类,定义于头文件 <queue> 中。

队列(queue)

std::queue 是容器适配器,默认的底层容器为双端队列 std::deque

q.empty()               如果队列为空返回true,否则返回false
q.size()                返回队列中元素的个数
q.pop()                 删除队列首元素但不返回其值
q.front()               返回队首元素的值,但不删除该元素
q.push()                在队尾压入新元素
q.back()                返回队列尾元素的值,但不删除该元素

优先队列(priority_queue)

priority_queuequeue不同的就在于可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队。

优先队列具有队列的所有特性,包括队列的基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的。

q.top()                    访问队头元素
q.empty()                  队列是否为空
q.size()                   返回队列内元素个数
q.push()                   插入元素到队尾 (并排序)
q.emplace()                原地构造一个元素并插入队列
q.pop()                    弹出队头元素
q.swap()                   交换内容

定义:priority_queue<Type, Container, Functional>

Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 listSTL里面默认用的是vector),Functional 就是比较的方式。

当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆

一般是:

//升序队列,小顶堆
priority_queue <int,vector<int>,greater<int> > q;
//降序队列,大顶堆
priority_queue <int,vector<int>,less<int> >q;

//greater和less是std实现的两个仿函数(就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了)

自定义数据类型和比较规则:

struct TMP{
        int x;
        string s;
        TMP( int a= 0, string b= "" ):
          x(a), s(b) {}
};
struct cmp{
        bool operator () ( TMP a, TMP b ){//返回true,a的优先级大于b
        //x大的排在队前部;x相同时,y大的排在队前部
        if( a.x== b.x ) return a.s< b.s;
        return a.x> b.x; 
        }
};


priority_queue<TMP ,vector<TMP>,cmp > ans;

[参考链接]
https://www.cnblogs.com/huashanqingzhu/p/11040390.html
https://blog.csdn.net/u014609638/article/details/106987131
https://oi-wiki.org/ds/queue/

推荐阅读更多精彩内容