方法一:利用大顶堆进行排序,再设置一个延迟删除大顶堆(保存删除值,直到下一次查询最大值再从大顶堆里弹出)
class MaxQueue {
public:
priority_queue<int,vector<int>,less<int>> maxq,delq; //排序队列,延时删除队列
queue<int> q; //基本队列
MaxQueue() {
}
int max_value() {
if(q.empty())
return -1;
if(delq.size()!=0){
while(maxq.top()==delq.top()){
maxq.pop();
delq.pop();
}
}
return maxq.top();
}
void push_back(int value) {
q.push(value);
maxq.push(value);
}
int pop_front() {
if(q.empty())
return -1;
int t=q.front();
q.pop();
delq.push(t);
return t;
}
};
方法二:利用双端队列deque
可知,若压入新值value,那么前面入队列且比value小的值就不会是最大值,直到队列里比value更大的值。
因此可以从队列尾开始循环,若q.back()<value,执行q.pop_back(),直到遇到比value大的值,再压入value,即q.push_back(value)
class MaxQueue {
public:
deque<int> maxq;
queue<int> q; //基本队列
MaxQueue() {
}
int max_value() {
if(maxq.empty())
return -1;
return maxq.front();
}
void push_back(int value) {
q.push(value);
while((maxq.empty()==0) && value>maxq.back())
maxq.pop_back();
maxq.push_back(value);
}
int pop_front() {
if(q.empty())
return -1;
if(maxq.front()==q.front())
maxq.pop_front();
int t=q.front();
q.pop();
return t;
}
};