题目来自leetcode
class MaxQueue {
public:
queue<int>que;
deque<int>deq;
MaxQueue() {
}
int max_value() {
return deq.empty() ? -1:deq.front();
}
void push_back(int value) {
while(!deq.empty()&&deq.back()<value){
deq.pop_back();
}
deq.push_back(value);
que.push(value);
}
int pop_front() {
if(que.empty()){return -1;}
int t=que.front();
if(t==deq.front()){
deq.pop_front();
}
que.pop();
return t;
}
};
/**
* Your MaxQueue object will be instantiated and called as such:
* MaxQueue* obj = new MaxQueue();
* int param_1 = obj->max_value();
* obj->push_back(value);
* int param_3 = obj->pop_front();
*/
介绍以下队列,双队列用法
队列:
双队列:
二者共有的函数:
访问第一个元素q.front();
最后一个元素q.back()
这里用一个双队列以非递增的形式记录数据,即对头大,队尾小,取最大值即取对头元素,这样就可以不用遍历队列找到最大值,是用空间换取时间的做法。