优先级队列是一种应用广泛的数据结构,例如可以用在dijsktra 算法中。我们这里使用deque来实现优先级队列,deque支持常数时间内随机访问以及首位添加和删除操作,非常适合用来实现优先级队列。
啥也不说了,上代码。
#include <deque>
#include <limits>
using namespace std;
class PriorityQueue {
public:
PriorityQueue() {
a.push_back(1);
}
void push(int val) {
a.pop_front();
a.push_front(val);
a.push_front(1);
heapfy(1);
}
int top() {
return a[1];
}
void pop() {
swap(a[1], a[a.size() - 1]);
a.pop_back();
heapfy(1);
}
int size() {
return a.size() - 1;
}
private:
void heapfy(int beg) {
if (beg >= a.size()) return;
if ((beg<<1 >= a.size() || a[beg] >= a[beg<<1])
&& (beg<<1 + 1 >= a.size() || a[beg] >= a[beg<<1 + 1])) return;
int l = numeric_limits<int>::min();
int r = numeric_limits<int>::min();
if (beg<<1 + 1 < a.size()) {
r = a[beg<<1 + 1];
}
if (beg<<1 < a.size()) {
l = a[beg<<1];
}
if (r >= l) {
if (r != numeric_limits<int>::min()) {
swap(a[beg<<1 + 1], a[beg]);
heapfy(beg<<1 + 1);
}
} else {
if (l != numeric_limits<int>::min()) {
swap(a[beg<<1], a[beg]);
heapfy(beg<<1);
}
}
}
deque<int> a;
};