1670. 设计前中后队列
2023-09-14 09:06:52 时间
1670. 设计前中后队列
请你设计一个队列,支持在前,中,后三个位置的 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] 。
示例 1:
输入:
[“FrontMiddleBackQueue”, “pushFront”, “pushBack”, “pushMiddle”, “pushMiddle”, “popFront”, “popMiddle”, “popMiddle”, “popBack”, “popFront”]
[[], [1], [2], [3], [4], [], [], [], [], []]
输出:
[null, null, null, null, null, 1, 3, 4, 2, -1]
解释:
FrontMiddleBackQueue q = new FrontMiddleBackQueue();
q.pushFront(1); // [1]
q.pushBack(2); // [1, 2]
q.pushMiddle(3); // [1, 3, 2]
q.pushMiddle(4); // [1, 4, 3, 2]
q.popFront(); // 返回 1 -> [4, 3, 2]
q.popMiddle(); // 返回 3 -> [4, 2]
q.popMiddle(); // 返回 4 -> [2]
q.popBack(); // 返回 2 -> []
q.popFront(); // 返回 -1 -> [] (队列为空)
typedef struct {
int val;
struct node *next;
struct node *pre;
} node;
typedef struct {
int size;
struct node *rear;
struct node *front;
} FrontMiddleBackQueue;
FrontMiddleBackQueue* frontMiddleBackQueueCreate() {
FrontMiddleBackQueue *queue=(FrontMiddleBackQueue*)malloc(sizeof(FrontMiddleBackQueue));
queue->size=0;
node *p=(node*)malloc(sizeof(node));
p->next=NULL;
p->pre=NULL;
queue->front=p;
queue->rear=p;
return queue;
}
void frontMiddleBackQueuePushFront(FrontMiddleBackQueue* obj, int val) {
obj->size++;
node *p=(node*)malloc(sizeof(node)),*s,*t;
p->val=val;
s=obj->front;
t=s->next;
if(t!=NULL)
t->pre=p;
p->next=s->next;
p->pre=obj->front;
s->next=p;
}
void frontMiddleBackQueuePushMiddle(FrontMiddleBackQueue* obj, int val) {
node *p=obj->front;
int i=0;
for(i;i<obj->size/2;i++){
p=p->next;
}
node *s=(node*)malloc(sizeof(node)),*t;
s->val=val;
s->pre=p;
s->next=p->next;
t=p->next;
if(t!=NULL)
t->pre=s;
p->next=s;
obj->size++;
}
void frontMiddleBackQueuePushBack(FrontMiddleBackQueue* obj, int val) {
obj->size++;
node *p=(node*)malloc(sizeof(node)),*s,*t;
p->val=val;
s=obj->rear;
while(s->next!=NULL){
s=s->next;
}
p->next=NULL;
s->next=p;
p->pre=s;
obj->rear=p;
}
int frontMiddleBackQueuePopFront(FrontMiddleBackQueue* obj) {
node *p=obj->front,*t;
node *s;
p=p->next;
while(p){
p=p->next;
}
p=obj->front;
s=p->next;
if(s==NULL){
return -1;
}
int val=s->val;
t=s->next;
if(t!=NULL){
t->pre=obj->front;
}
p->next=s->next;
obj->size--;
return val;
}
int frontMiddleBackQueuePopMiddle(FrontMiddleBackQueue* obj) {
node *p=obj->front,*t;
int i=0;
for(i;i<(obj->size-1)/2;i++){
// printf("--m %d ",p->val);
p=p->next;
}
node *s;
s=p->next;
if(s==NULL){
return -1;
}
int val=s->val;
t=s->next;
if(t!=NULL)
t->pre=p;
p->next=s->next;
obj->size--;
return val;
}
int frontMiddleBackQueuePopBack(FrontMiddleBackQueue* obj) {
node *p=obj->rear;
// printf("back %d ",p->val);
if(p==NULL||obj->size==0){
return -1;
}
// printf(" asdfa %d ",p->val);
while(p->next!=NULL){
// printf("--b %d ",p->val);
p=p->next;
}
node *s;
s=p->pre;
if(s!=NULL){
s->next=NULL;
}
obj->rear=s;
if(p==NULL){
return -1;
}
obj->size--;
return p->val;
}
void frontMiddleBackQueueFree(FrontMiddleBackQueue* obj) {
}
/**
* Your FrontMiddleBackQueue struct will be instantiated and called as such:
* FrontMiddleBackQueue* obj = frontMiddleBackQueueCreate();
* frontMiddleBackQueuePushFront(obj, val);
* frontMiddleBackQueuePushMiddle(obj, val);
* frontMiddleBackQueuePushBack(obj, val);
* int param_4 = frontMiddleBackQueuePopFront(obj);
* int param_5 = frontMiddleBackQueuePopMiddle(obj);
* int param_6 = frontMiddleBackQueuePopBack(obj);
* frontMiddleBackQueueFree(obj);
*/
相关文章
- python之rabbitMQ二:队列、消息持久化
- 消息队列函数(msgget、msgctl、msgsnd、msgrcv)及其范例
- RabbitMQ消息队列(四):分发到多Consumer(Publish/Subscribe)
- PYTHON线程知识再研习F---队列同步Queue
- 232. 用栈实现队列
- Python 多线程|thread,使用threading模块创建线程,线程同步,线程优先级队列( Queue)
- 【Android 异步操作】手写 Handler ( 消息队列 MessageQueue | 消息保存到链表 | 从链表中获取消息 )
- 优先队列PriorityQueue实现 大小根堆 解决top k 问题
- (hdu step 8.1.1)ACboy needs your help again!(STL中栈和队列的基本使用)
- rabbitmq 延时队列
- C#实现ActiveMQ消息队列
- RT-Thread之消息队列