美文网首页
LeetCode - 641. 设计循环双端队列 swift &

LeetCode - 641. 设计循环双端队列 swift &

作者: huxq_coder | 来源:发表于2020-08-25 17:13 被阅读0次

    设计实现双端队列。
    你的实现需要支持以下操作:

    MyCircularDeque(k):构造函数,双端队列的大小为k。
    insertFront():将一个元素添加到双端队列头部。 如果操作成功返回 true。
    insertLast():将一个元素添加到双端队列尾部。如果操作成功返回 true。
    deleteFront():从双端队列头部删除一个元素。 如果操作成功返回 true。
    deleteLast():从双端队列尾部删除一个元素。如果操作成功返回 true。
    getFront():从双端队列头部获得一个元素。如果双端队列为空,返回 -1。
    getRear():获得双端队列的最后一个元素。 如果双端队列为空,返回 -1。
    isEmpty():检查双端队列是否为空。
    isFull():检查双端队列是否满了。
    示例:

    MyCircularDeque circularDeque = new MycircularDeque(3); // 设置容量大小为3
    circularDeque.insertLast(1); // 返回 true
    circularDeque.insertLast(2); // 返回 true
    circularDeque.insertFront(3); // 返回 true
    circularDeque.insertFront(4); // 已经满了,返回 false
    circularDeque.getRear(); // 返回 2
    circularDeque.isFull(); // 返回 true
    circularDeque.deleteLast(); // 返回 true
    circularDeque.insertFront(4); // 返回 true
    circularDeque.getFront(); // 返回 4

    提示:

    所有值的范围为 [1, 1000]
    操作次数的范围为 [1, 1000]
    请不要使用内置的双端队列库。

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

    双端循环队列开始 双端循环队列满

    算法

    swift

    class MyCircularDeque {
        var deque: [Int]
        var capacity: Int   // 大小
        var front: Int  // 头指针,第一个元素的索引
        var rear: Int   // 尾指针,最后一个元素的下一个索引
        
        /** Initialize your data structure here. Set the size of the deque to be k. */
        init(_ k: Int) {
            // 大小多一,避免循环双端队列为 空 和 满 时无法判断
            capacity = k + 1
            deque = [Int](repeating: 0, count: capacity)
            front = 0
            rear = 0
        }
        
        /** Checks whether the circular deque is empty or not. */
        func isEmpty() -> Bool {
            return front == rear
        }
        
        /** Checks whether the circular deque is full or not. */
        func isFull() -> Bool {
            if front == (rear + 1) % capacity {
                return true
            }
            return false
        }
        
        /** Adds an item at the front of Deque. Return true if the operation is successful. */
        func insertFront(_ value: Int) -> Bool {
            if isFull() {
                return false
            }
            // 头插,先向前移动 头指针,再插入数据
            front = (front - 1 + capacity) % capacity
            deque[front] = value
            return true
        }
        
        /** Adds an item at the rear of Deque. Return true if the operation is successful. */
        func insertLast(_ value: Int) -> Bool {
            if isFull() {
                return false
            }
            // 尾插,先插入数据,再向后移动尾指针
            deque[rear] = value
            rear = (rear + 1) % capacity
            return true
        }
        
        /** Deletes an item from the front of Deque. Return true if the operation is successful. */
        func deleteFront() -> Bool {
            if isEmpty() {
                return false
            }
            // 头指针向前移动
            front = (front + 1) % capacity
            return true
        }
        
        /** Deletes an item from the rear of Deque. Return true if the operation is successful. */
        func deleteLast() -> Bool {
            if isEmpty() {
                return false
            }
            // 尾指针向后移动
            rear = (rear - 1 + capacity) % capacity
            return true
        }
        
        /** Get the front item from the deque. */
        func getFront() -> Int {
            if isEmpty() {
                return -1
            }
            return deque[front]
        }
        
        /** Get the last item from the deque. */
        func getRear() -> Int {
            if isEmpty() {
                return -1
            }
            // 尾指针指向索引是null,取尾指针索引元素时,取尾指针的前一个
            return deque[(rear - 1 + capacity) % capacity]
        }
    }
    
    /**
     * Your MyCircularDeque object will be instantiated and called as such:
     * let obj = MyCircularDeque(k)
     * let ret_1: Bool = obj.insertFront(value)
     * let ret_2: Bool = obj.insertLast(value)
     * let ret_3: Bool = obj.deleteFront()
     * let ret_4: Bool = obj.deleteLast()
     * let ret_5: Int = obj.getFront()
     * let ret_6: Int = obj.getRear()
     * let ret_7: Bool = obj.isEmpty()
     * let ret_8: Bool = obj.isFull()
     */
    
    

    Java

    /*
     * @lc app=leetcode.cn id=641 lang=java
     *
     * [641] 设计循环双端队列
     */
    
    // @lc code=start
    class MyCircularDeque {
    
        private int front;
        private int rear;
        private int capacity;
        private int[] deque;
    
        /** Initialize your data structure here. Set the size of the deque to be k. */
        public MyCircularDeque(int k) {
            capacity = k + 1;
            deque = new int[capacity]; 
            front = 0;
            rear = 0;
        }
        
        /** Adds an item at the front of Deque. Return true if the operation is successful. */
        public boolean insertFront(int value) {
            if (isFull()) {
                return false;
            } else {
                front = (front - 1 + capacity) % capacity;
                deque[front] = value;
                return true;
            }
        }
        
        /** Adds an item at the rear of Deque. Return true if the operation is successful. */
        public boolean insertLast(int value) {
            if (isFull()) {
                return false;
            } else {
                deque[rear] = value;
                rear = (rear + 1) % capacity;
                return true;
            }
        }
        
        /** Deletes an item from the front of Deque. Return true if the operation is successful. */
        public boolean deleteFront() {
            if (isEmpty()) {
                return false;
            } else {
                front = (front + 1) % capacity;
                return true;
            }
        }
        
        /** Deletes an item from the rear of Deque. Return true if the operation is successful. */
        public boolean deleteLast() {
            if (isEmpty()) {
                return false;
            } else {
                rear = (rear - 1 + capacity) % capacity;
                return true;
            }
        }
        
        /** Get the front item from the deque. */
        public int getFront() {
            if (isEmpty()) {
                return -1;
            }
            return deque[front];
        }
        
        /** Get the last item from the deque. */
        public int getRear() {
            if (isEmpty()) {
                return -1;
            }
            return deque[(rear - 1 + capacity) % capacity];
        }
        
        /** Checks whether the circular deque is empty or not. */
        public boolean isEmpty() {
            return rear == front;
        }
        
        /** Checks whether the circular deque is full or not. */
        public boolean isFull() {
            return (rear + 1) % capacity == front;
        }
    }
    
    /**
     * Your MyCircularDeque object will be instantiated and called as such:
     * MyCircularDeque obj = new MyCircularDeque(k);
     * boolean param_1 = obj.insertFront(value);
     * boolean param_2 = obj.insertLast(value);
     * boolean param_3 = obj.deleteFront();
     * boolean param_4 = obj.deleteLast();
     * int param_5 = obj.getFront();
     * int param_6 = obj.getRear();
     * boolean param_7 = obj.isEmpty();
     * boolean param_8 = obj.isFull();
     */
    

    GitHub:https://github.com/huxq-coder/LeetCode

    相关文章

      网友评论

          本文标题:LeetCode - 641. 设计循环双端队列 swift &

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