**请你设计一个队列,支持在前,中,后三个位置的 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] 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/design-front-middle-back-queue
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。**
C++代码实现
class FrontMiddleBackQueue {
public:
class Node{
//内部类node 用链表存储数据
public:
int val;
Node* next;
Node(int v){
val = v;
}
};
int size;
Node* head;
FrontMiddleBackQueue() {
//构造方法, 初始化长度,创建哑节点.
size = 0;
head = new Node(0);
head->next = NULL;
}
void pushFront(int val) {
//头部插入节点, 维护队列长度
Node* x = new Node(val);
x->next = NULL;
Node* pre = head->next;
head->next = x;
x->next = pre;
size++;
}
void pushMiddle(int val) {
//中间插入节点
if(size<2){
pushFront(val);
return;
}
Node* res = new Node(val);
int sum = size/2-1;
Node* x = head->next;
while(sum !=0){
x = x->next;
sum--;
}
Node* pre = x->next;
x->next = res;
res->next = pre;
size++;
}
void pushBack(int val) {
//末尾插入节点
if(size == 0){
head->next = new Node(val);
head->next->next = NULL;
size ++;
return;
}
Node* end = head->next;
while(end->next){
end = end->next;
}
Node* x = new Node(val);
x->next = NULL;
end->next = x;
size++;
}
int popFront() {
return deleteNode(0);
}
int popMiddle() {
return deleteNode((size+1)/2-1);
}
int popBack() {
return deleteNode(size-1);
}
int deleteNode(int index){
//通过下标删除节点, 上方三个方法通过计算下标调用
if(size == 0){
return -1;
}
if(index == 0){
int r = head->next->val;
head->next = head->next->next;
size--;
showHead();
return r;
}
Node* pre = head;
while(index!=0){
pre = pre->next;
index--;
}
int res = pre->next->val;
pre->next = pre->next->next;
size--;
return res;
}
void showHead(){
//展示整个列表内容, 用于调试
Node* x = head->next;
while(x){
cout<<x->val;
x = x->next;
}
cout<<endl;
}
};