队列queue碎碎记

queue队列很常见,那么它主要关注的点就在于是先进先出的。那么队列容器从一段加入元素,从另一端移除或输出元素。因此只可以对队头和队尾进行访问,并不支持整体队列的遍历。

queue对外结构
  • queueque; // 构造函数
  • que.push(elem); // 添加元素
  • que.pop(); // 移除元素
  • que.front(); // 访问队头元素
  • que.back(); // 访问队尾元素
  • que.empty(); // 是否为空
  • que.size(); // 具体大小
优先级队列

优先级队列同样提供一端加入元素,另一端移除元素的接口,并且其内部元素的顺序并不是先进先出,而是保持从大到小或者从小到大的顺序(自动排序),因此是一种特殊的队列。而其内部其实是用堆进行实现的。
堆是一棵完全二叉树,树中每个结点的值都不小于(或不大于)其左右孩子的值。 如果父亲结点是大于等于左右孩子就是大顶堆,小于等于左右孩子就是小顶堆。
所以大顶堆(堆头是最大元素),小顶堆(堆头是最小元素),如果懒得自己实现的话,就直接用priority_queue(优先级队列)就可以了,底层实现都是一样的,从小到大排就是小顶堆,从大到小排就是大顶堆。
那么其常用格式为:

priority_queue <int> que1;

那么上述定义默认是从大到小排序,或者我们详细些:

priority_queue <int,vector<int>,greater<int> > q;
// 从小到大排序
priority_queue <int,vector<int>,less<int> >q;
// 从大到小排序

那么我们也可以自己定义我们自己的排序函数,来针对我们特殊的结构进行排序,例如:

class mycomparison {
public:
    bool operator()(const pair<int, int>& lhs, const pair<int, int>& rhs) {
        return lhs.second > rhs.second;
    }
};
priority_queue<pair<int, int>, vector<pair<int, int>>, mycomparison> pri_que;

上述我们的数据结构为pair,因此第二个参数vector里面的类型也为pair,那么第三个参数对比函数我们需要自己写明对比规则,即myconparison函数。
或者我们用自己定义的结构体作为基本数据结构时,可以自己定义比较函数,也可以在结构体中重载<运算符,都可以达到相同的效果。
其对外的接口有:

  • q.size(); // 返回q里元素个数
  • q.empty(); // 返回q是否为空,空则返回1,否则返回0
  • q.push(k); // 在q的末尾插入k
  • q.pop(); // 删掉q的第一个元素
  • q.top(); // 返回q的第一个元素

注意没有back()函数

你可能感兴趣的:(力扣刷题记录,算法,数据结构,c++,力扣)