定义一个队列并实现函数max_value得到队列里的最大值。
要求max_value,push_back,pop_front的时间均摊复杂度为O(1)。
若队列为空,pop_front和max_value需要返回-1。
分析:
用一个queue和deque实现。
queue负责pop和push,deque负责存放最大值。
如果新的value的值大于deque尾端的值,那么deque一直进行pop_back操作,直至deque为空或者尾端的值大于等于value,然后将value值压入deque尾部,每次取max_value,返回deque首部的值。
当queue进行pop或push操作时,如果queue首部的值等于deque首部的值,那么deque同时需要进行pop_front操作。
class MaxQueue
{
public:
maxQueue()
{
}
int max_value
{
return que.empty()?-1 : que.front();
}
void push_back(int value)
{
que.push(value);
while(!deq.empty() && deq.back()<value)
{
deq.pop_back();
}
deq.push_back(value);
}
int pop_front()
{
if(que.empty()) return -1;
int t=que.front();
que.pop();
if(t==deq.front()) deq.pop_front();
return t;
}
private:
queue<int> que;
deque<int> deq;
};