题意:
请你设计一个队列,支持在前,中,后三个位置的 push 和 pop 操作。
请你完成 FrontMiddleBack 类:
FrontMiddleBack()初始化队列。void pushFront(int val)将val添加到队列的 最前面 。void pushMiddle(int val)将val添加到队列的 正中间 。void pushBack(int val)将val添加到队里的 最后面 。int popFront()将 最前面 的元素从队列中删除并返回值,如果删除之前队列为空,那么返回-1。int popMiddle()将 正中间 的元素从队列中删除并返回值,如果删除之前队列为空,那么返回-1。int popBack()将 最后面 的元素从队列中删除并返回值,如果删除之前队列为空,那么返回-1。
请注意当有 两个 中间位置的时候,选择靠前面的位置进行操作。比方说:
- 将
6添加到[1, 2, 3, 4, 5]的中间位置,结果数组为[1, 2, 6, 3, 4, 5]。 - 从
[1, 2, 3, 4, 5, 6]的中间位置弹出元素,返回3,数组变为[1, 2, 4, 5, 6]。
解题思路:
使用双端队列进行模拟即可
class FrontMiddleBackQueue {
public:
deque<int> q, t;
FrontMiddleBackQueue() {
while (!q.empty()) {
q.pop_back();
}
}
void pushFront(int val) {
q.push_front(val);
}
void pushMiddle(int val) {
deque<int>::iterator it = q.begin();
q.insert(it+(q.size()/2), val);
}
void pushBack(int val) {
q.push_back(val);
}
int popFront() {
if (q.empty()) {
return -1;
}
int f = q.front();
q.pop_front();
return f;
}
int popMiddle() {
if (q.empty()) {
return -1;
}
int f;
deque<int>::iterator it = q.begin();
if (q.size() % 2 == 0) {
f = q[q.size()/2-1];
q.erase(it + (q.size()/2-1));
} else {
f = q[q.size()/2];
q.erase(it + q.size()/2);
}
return f;
}
int popBack() {
if (q.empty()) {
return -1;
}
int f = q.back();
q.pop_back();
return f;
}
};
/**
* 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();
*/
该博客介绍了如何利用双端队列(deque)来设计一个支持在前、中、后位置进行push和pop操作的队列。具体实现包括在队列前端插入和删除元素、在中间插入和删除元素以及在队列后端插入和删除元素的方法。解题策略是通过维护两个双端队列,确保在不同位置的插入和删除操作高效进行。
1153

被折叠的 条评论
为什么被折叠?



