zl程序教程

您现在的位置是:首页 >  大数据

当前栏目

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);
*/