Leetcode 1670. 设计前中后队列

该博客介绍了如何利用双端队列(deque)来设计一个支持在前、中、后位置进行push和pop操作的队列。具体实现包括在队列前端插入和删除元素、在中间插入和删除元素以及在队列后端插入和删除元素的方法。解题策略是通过维护两个双端队列,确保在不同位置的插入和删除操作高效进行。

题目链接:Leetcode 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] 。

 

解题思路:

   使用双端队列进行模拟即可

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

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值