int类型
priority_queue<int, vector<int>, less<int>> pq; // 最大堆
priority_queue<int, vector<int>, greater<int>> pq; // 最小堆
非int类型
-
方法1 重载()
struct cmp{
bool operator()(ListNode* a, ListNode* b){
return a->val > b->val;
}
};
// priority_queue自定义函数的比较与sort正好是相反的
// 也就是说,如果你是把大于号作为第一关键字的比较方式,那么堆顶的元素就是第一关键字最小的
priority_queue<ListNode*, vector<ListNode*>, cmp> pq;
// 此时pq就按照节点的值将最小的放在堆顶
-
方法2 重载<
struct Status{
int val;
ListNode* node;
bool operator < (const Status &tmp) const{
// 函数必须是静态的 使得该函数可以被 const 对象也就是常量所调用
// 形参可以加上const关键字和&,保证安全性,提高效率
return val > tmp.val;
}
};
priority_queue<Status> pq;
-
方法3 利用友元函数重载<
struct Status{
int val;
ListNode* node;
friend bool operator<(Status a, Status b) // 形参可以加上const关键字和&,保证安全性,提高效率
{
return a.val > b.val;
}
};
priority_queue<Status> pq;
单调栈与优先队列的区别
单调栈底层数据结构:栈; 优先队列底层数据结构:二叉堆(完全二叉树,满足最值堆);
数据结构 | 主要特点 | 时间复杂度 | 支持随机访问 | 支持插入/删除位置 |
---|---|---|---|---|
单调栈 | 维护数组下标进行排列。 | O(n) | 不支持 | 一端插入/删除 |
优先队列 | 维护一组元素,支持查找和删除最大(最小)元素 | O(log n) | 支持 | 任意位置插入/删除 |