zoukankan      html  css  js  c++  java
  • 622. Design Circular Queue

    Design your implementation of the circular queue. The circular queue is a linear data structure in which the operations are performed based on FIFO (First In First Out) principle and the last position is connected back to the first position to make a circle. It is also called "Ring Buffer".

    One of the benefits of the circular queue is that we can make use of the spaces in front of the queue. In a normal queue, once the queue becomes full, we cannot insert the next element even if there is a space in front of the queue. But using the circular queue, we can use the space to store new values.

    Your implementation should support following operations:

    • MyCircularQueue(k): Constructor, set the size of the queue to be k.
    • Front: Get the front item from the queue. If the queue is empty, return -1.
    • Rear: Get the last item from the queue. If the queue is empty, return -1.
    • enQueue(value): Insert an element into the circular queue. Return true if the operation is successful.
    • deQueue(): Delete an element from the circular queue. Return true if the operation is successful.
    • isEmpty(): Checks whether the circular queue is empty or not.
    • isFull(): Checks whether the circular queue is full or not.

    Example:

    MyCircularQueue circularQueue = new MyCircularQueue(3); // set the size to be 3
    circularQueue.enQueue(1);  // return true
    circularQueue.enQueue(2);  // return true
    circularQueue.enQueue(3);  // return true
    circularQueue.enQueue(4);  // return false, the queue is full
    circularQueue.Rear();  // return 3
    circularQueue.isFull();  // return true
    circularQueue.deQueue();  // return true
    circularQueue.enQueue(4);  // return true
    circularQueue.Rear();  // return 4
    

    Note:

    • All values will be in the range of [0, 1000].
    • The number of operations will be in the range of [1, 1000].
    • Please do not use the built-in Queue library.
    class MyCircularQueue {
    
        final int[] arr;
        int front = 0, len = 0, rear = -1;
        /** Initialize your data structure here. Set the size of the queue to be k. */
        public MyCircularQueue(int k) {
            arr = new int[k];
        }
        
        /** Insert an element into the circular queue. Return true if the operation is successful. */
        public boolean enQueue(int value) {
            if(isFull()) return false;
            else{
                rear = (1 + rear) % arr.length;
                arr[rear] = value;
                len++;
            }
            return true;
        }
        
        /** Delete an element from the circular queue. Return true if the operation is successful. */
        public boolean deQueue() {
            if(isEmpty()) return false;
            else{
                front = (1 + front) % arr.length;
                len--;
            }
            return true;
        }
        
        /** Get the front item from the queue. */
        public int Front() {
            return isEmpty() ? -1 : arr[front];
        }
        
        /** Get the last item from the queue. */
        public int Rear() {
            return isEmpty() ? -1 : arr[rear];
        }
        
        /** Checks whether the circular queue is empty or not. */
        public boolean isEmpty() {
            return len == 0;
        }
        
        /** Checks whether the circular queue is full or not. */
        public boolean isFull() {
            return len == arr.length;
        }
    }
    
    /**
     * Your MyCircularQueue object will be instantiated and called as such:
     * MyCircularQueue obj = new MyCircularQueue(k);
     * boolean param_1 = obj.enQueue(value);
     * boolean param_2 = obj.deQueue();
     * int param_3 = obj.Front();
     * int param_4 = obj.Rear();
     * boolean param_5 = obj.isEmpty();
     * boolean param_6 = obj.isFull();
     */

     像设置两个指针一样,front和end,用mod来实现circular,用数组实现调取和存入,len是当前queue的size。

    每次入队列不会影响front,只改变往后挪一位rear

    同样每次出队列不会影响rear,也往后挪一位front,如果超了数组长度就通过mod重来

  • 相关阅读:
    JavaScript Patterns 5.7 Object Constants
    JavaScript Patterns 5.6 Static Members
    JavaScript Patterns 5.5 Sandbox Pattern
    JavaScript Patterns 5.4 Module Pattern
    JavaScript Patterns 5.3 Private Properties and Methods
    JavaScript Patterns 5.2 Declaring Dependencies
    JavaScript Patterns 5.1 Namespace Pattern
    JavaScript Patterns 4.10 Curry
    【Android】如何快速构建Android Demo
    【Android】如何实现ButterKnife
  • 原文地址:https://www.cnblogs.com/wentiliangkaihua/p/13217132.html
Copyright © 2011-2022 走看看