美文网首页
【算法题】1670. 设计前中后队列

【算法题】1670. 设计前中后队列

作者: 程序员小2 | 来源:发表于2023-02-03 10:46 被阅读0次

题目:

请你设计一个队列,支持在前,中,后三个位置的 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 -> [] (队列为空)

提示:

1 <= val <= 10^9
最多调用 1000 次 pushFront, pushMiddle, pushBack, popFront, popMiddle 和 popBack 。

java代码:

class FrontMiddleBackQueue {
    int size;
    Node head;
    Node tail;
    public FrontMiddleBackQueue() {
        this.size = 0;
        this.head = new Node();
        this.tail = new Node();
        head.next = tail;
        tail.pre = head;
        
    }

    public void pushFront(int val) {
        insert(head, head.next, val);
        size++;
    }

    public void pushMiddle(int val) {
        Node mid = findMid(head);
        insert(mid, mid.next, val);
        size++;
    }

    public void pushBack(int val) {
        insert(tail.pre, tail, val);
        size++;
    }

    public int popFront() {
        if (isEmpty()) {
            return -1;
        }
        int val = head.next.value;
        delete(head.next);
        size--;
        return val;

    }

    public int popMiddle() {
        if (isEmpty()) {
            return -1;
        }

        Node mid = findMid(head);
        if (size % 2 == 1) {
            mid = mid.next;
        }
        int val = mid.value;
        delete(mid);
        size--;
        return val;
    }

    public int popBack() {
        if (isEmpty()) {
            return -1;
        }
        int val = tail.pre.value;
        delete(tail.pre);
        size--;
        return val;
    }


    public boolean isEmpty() {
        return size == 0;
    }

    public void insert(Node pre, Node next, int value) {
        Node node = new Node(value);
        pre.next = node;
        node.pre = pre;

        node.next = next;
        next.pre = node;
    }

    public void delete(Node node) {
        Node pre = node.pre;
        Node next = node.next;
        pre.next = next;
        next.pre = pre;
    }

    public Node findMid(Node node) {
        Node fast = node;
        Node slow = node;
        Node p = null;
        while (fast != null && fast.next != null) {
            p = slow;
            slow = slow.next;
            fast = fast.next.next;
        }
        return p;
    }

    static class Node {

        Node pre;
        Node next;
        int value;

        public Node() {

        }

        public Node(int value) {
            this.value = value;
        }
    }
}

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

相关文章

  • 【算法题】1670. 设计前中后队列

    题目: 请你设计一个队列,支持在前,中,后三个位置的 push 和 pop 操作。 请你完成 FrontMiddl...

  • leetcode链表之设计前中后队列

    1670、设计前中后队列[https://leetcode-cn.com/problems/design-fron...

  • python-数据结构 循环队列的实现 设计循环队列

    1.设计你的循环队列 Leet Code 原题链接Leet Code 原题动画演示视频设计你的循环队列实现。 循环...

  • 栈和队列算法设计题(二)

    题目 假设以I和O分别表示入栈和出栈操作。栈的初态和终态均为空,入栈和出栈的操作顺序可表示为仅由I和O组成的序列,...

  • 栈和队列算法设计题(一)

    题目 回文是指正读反读均相同的字符序列,如“abba”和“abdba”均是回文,但“good”不是回文。试写一个算...

  • 数据结构——栈和队列

    用数组实现栈和队列 用栈实现队列 用队列实现栈 栈和队列的经典算法题最小间距栈宠物收养所 数组实现栈和队列 用数组...

  • 多级队列调度算法

    多级队列调度算法将系统中不同类型或性质的就绪进程固定分配到不同的就绪队列中,每个就绪队列可以采用自己的调度算法;而...

  • 【算法题】猫狗队列

    实现一种猫狗队列的结构,要求如下: 用户可以调用add方法将cat类或者dog类的实例放入队列中; 用户可以调用p...

  • 栈与队列算法题

    栈 当前位置的元素不能立刻计算,需要隔着一段距离去找另一个对应的元素。 单调栈问题: 42.接雨水 (hard)当...

  • 面试复习-数据结构

    1.栈: 先入后出(一般用于算法中的回溯法) 2.队列: 先入先出(常考算法有:两个栈实现队列、二叉树的层序遍历)...

网友评论

      本文标题:【算法题】1670. 设计前中后队列

      本文链接:https://www.haomeiwen.com/subject/gmfnhdtx.html