使用一个queue和一个deque,queue进行正常的push和pop操作,deque辅助找到当前队列中最大值
入队时,如果当前元素value小于deque队尾元素,直接把value入队deque;如果当前元素value大于deque队尾元素,从deque队尾开始,把小于value的元素全部从队尾出队。(deque内元素是降序的)
出队时,只要queue队首元素小于deque队首元素,直接出队queue队首元素即可;若queue队首元素和deque队首元素相等了,则两者一起出队。deque队首元素表示的是,queue不把该值出队,deque队首元素都是最大的
class MaxQueue {
public:
queue<int> q;
deque<int> deq;
MaxQueue() {
}
int max_value() {
if(q.empty()){
return -1;
}
return deq.front();
}
void push_back(int value) {
while(!deq.empty() && value > deq.back()){
deq.pop_back();
}
q.push(value);
deq.push_back(value);
}
int pop_front() {
if(q.empty()){
return -1;
}
if(deq.front() == q.front()){
deq.pop_front();
}
int ans = q.front();
q.pop();
return ans;
}
};