leetcode 1670. 设计前中后队列 C++实现

**请你设计一个队列,支持在前,中,后三个位置的 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;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_45789385/article/details/112982393