题目来源:
leetcode题目,网址:1670. 设计前中后队列 - 力扣(LeetCode)
解题思路:
维护两个双向队列 front 和 back。假设共有 n 个元素,则front 存放位于 [0,n/2) 的元素,back 存放位于 [n/2,n] 的元素。(n/2 为整除,向下取整)
解题代码:
class FrontMiddleBackQueue {
private:
//中部元素为 front 尾元素
deque<int> front;
deque<int> back;
public:
FrontMiddleBackQueue() {
front.clear();
back.clear();
}
void pushFront(int val) {
front.push_front(val);
if(front.size()>back.size()){
back.push_front(front.back());
front.pop_back();
}
}
void pushMiddle(int val) {
front.push_back(val);
if(front.size()>back.size()){
back.push_front(front.back());
front.pop_back();
}
}
void pushBack(int val) {
back.push_back(val);
if(back.size()-front.size()>=2){
front.push_back(back.front());
back.pop_front();
}
}
int popFront() {
int res=-1;
if(front.size()==0){
if(back.size()!=0){
res=back.front();
back.pop_front();
}
return res;
}
res=front.front();
front.pop_front();
if(back.size()-front.size()>=2){
front.push_back(back.front());
back.pop_front();
}
return res;
}
int popMiddle() {
int res=-1;
if(front.size()==0){
if(back.size()!=0){
res=back.front();
back.pop_front();
}
return res;
}
if(front.size()<back.size()){
res=back.front();
back.pop_front();
}else{
res=front.back();
front.pop_back();
if(back.size()-front.size()>=2){
front.push_back(back.front());
back.pop_front();
}
}
return res;
}
int popBack() {
if(back.size()==0){
return -1;
}
int res=back.back();
back.pop_back();
if(front.size()>back.size()){
back.push_front(front.back());
front.pop_back();
}
return res;
}
};
/**
* Your FrontMiddleBackQueue object will be instantiated and called as such:
* FrontMiddleBackQueue* obj = new FrontMiddleBackQueue();
* obj->pushFront(val);
* obj->pushMiddle(val);
* obj->pushBack(val);
* int param_4 = obj->popFront();
* int param_5 = obj->popMiddle();
* int param_6 = obj->popBack();
*/
总结:
官方题解也是使用双端队列。