LeetCode 622. 设计循环队列

作者: TheKey_ | 来源:发表于2019-08-21 18:37 被阅读1次

    622. 设计循环队列

    设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。

    循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。

    你的实现应该支持如下操作:

    • MyCircularQueue(k): 构造器,设置队列长度为 k 。
    • Front: 从队首获取元素。如果队列为空,返回 -1 。
    • Rear: 获取队尾元素。如果队列为空,返回 -1 。
    • enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。
    • deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。
    • isEmpty(): 检查循环队列是否为空。
    • isFull(): 检查循环队列是否已满。
    示例:
    MyCircularQueue circularQueue = new MycircularQueue(3); // 设置长度为 3
    
    circularQueue.enQueue(1);  // 返回 true
    
    circularQueue.enQueue(2);  // 返回 true
    
    circularQueue.enQueue(3);  // 返回 true
    
    circularQueue.enQueue(4);  // 返回 false,队列已满
    
    circularQueue.Rear();  // 返回 3
    
    circularQueue.isFull();  // 返回 true
    
    circularQueue.deQueue();  // 返回 true
    
    circularQueue.enQueue(4);  // 返回 true
    
    circularQueue.Rear();  // 返回 4
    
    提示:
    • 所有的值都在 0 至 1000 的范围内;
    • 操作数将在 1 至 1000 的范围内;
    • 请不要使用内置的队列库。

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/design-circular-queue/
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


    • 设计循环队列

    思路:

    image.png
    image.png
    image.png
    public class MyCircularQueue {
    
        private int[] data;
        private int head;   //头指针
        private int tail;   //尾指针
        private int size;
    
        /** Initialize your data structure here. Set the size of the queue to be k. */
        public MyCircularQueue(int k) {
            //有意浪费一个空间
            data = new int[k + 1];
            size = 0;
            head = 0;
            tail = 0;
        }
    
        /** Insert an element into the circular queue. Return true if the operation is successful. */
        public boolean enQueue(int value) {
            //如果队列已满
            if (isFull()) return false;
            data[tail] = value;
            tail = (tail + 1) % data.length;
            size++;
            return true;
        }
    
        /** Delete an element from the circular queue. Return true if the operation is successful. */
        public boolean deQueue() {
            if (isEmpty()) return false;
            //int res = data[head];
            head = (head + 1) % data.length;
            size--;
            return true;
        }
    
        /** Get the front item from the queue. */
        public int Front() {
            if (isEmpty()) return -1;
            return data[head];
        }
    
        /** Get the last item from the queue. */
        public int Rear() {
            if (isEmpty()) return -1;
            System.out.println(data.length);
            if (tail != 0) return data[tail - 1];
            else return data[data.length - 1];
        }
    
        /** Checks whether the circular queue is empty or not. */
        public boolean isEmpty() {
            return head == tail;
        }
    
        /** Checks whether the circular queue is full or not. */
        public boolean isFull() {
            return (tail + 1) % data.length == head;
        }
    }
    
    

    复杂度分析:

    • 时间复杂度:O(1),循环队列的入队出队操作都是O(1)的时间复杂度(该题不涉及扩容操作)

    • 空间复杂度:O(n), 开辟的数组空间

    • 测试用例

    public static void main(String[] args) {
            MyCircularQueue circularQueue = new MyCircularQueue(3); // 设置长度为 3
            circularQueue.enQueue(1);
            circularQueue.enQueue(2);
            circularQueue.enQueue(3);
            circularQueue.enQueue(4);
            circularQueue.Rear();
    //        System.out.println(circularQueue.Rear());
            circularQueue.isFull();
            circularQueue.deQueue();
            circularQueue.enQueue(4);
            circularQueue.Rear();
        }
    
    • 结果

    true
    true
    true
    false
    3
    true
    true
    true
    4
    

    • 源码

    • 我会每天更新新的算法,并尽可能尝试不同解法,如果发现问题请指正
    • Github

    相关文章

      网友评论

        本文标题:LeetCode 622. 设计循环队列

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