zoukankan      html  css  js  c++  java
  • 设计循环队列——写起来最清爽的还使用原生的deque 双端队列

    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 的范围内;
    • 请不要使用内置的队列库。
    from collections import deque
    
    class MyCircularQueue:
    
        def __init__(self, k: int):
            """
            Initialize your data structure here. Set the size of the queue to be k.
            """
            self.size = k
            self.q = deque(maxlen=k)
    
        def enQueue(self, value: int) -> bool:
            """
            Insert an element into the circular queue. Return true if the operation is successful.
            """
            if self.isFull():
                return False
            self.q.append(value)            
            return True        
    
        def deQueue(self) -> bool:
            """
            Delete an element from the circular queue. Return true if the operation is successful.
            """
            if self.isEmpty():
                return False
            self.q.popleft()
            return True
            
        def Front(self) -> int:
            """
            Get the front item from the queue.
            """
            if self.isEmpty():
                return -1
            return self.q[0]
    
        def Rear(self) -> int:
            """
            Get the last item from the queue.
            """
            if self.isEmpty():
                return -1
            return self.q[-1]
    
        def isEmpty(self) -> bool:
            """
            Checks whether the circular queue is empty or not.
            """
            return len(self.q) == 0
    
        def isFull(self) -> bool:
            """
            Checks whether the circular queue is full or not.
            """
            return len(self.q) == self.size
    
    
    # Your MyCircularQueue object will be instantiated and called as such:
    # obj = MyCircularQueue(k)
    # param_1 = obj.enQueue(value)
    # param_2 = obj.deQueue()
    # param_3 = obj.Front()
    # param_4 = obj.Rear()
    # param_5 = obj.isEmpty()
    # param_6 = obj.isFull()
    

    641. 设计循环双端队列

    难度中等

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

    • 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]
    • 请不要使用内置的双端队列库。
    from collections import deque
    
    class MyCircularDeque:
    
        def __init__(self, k: int):
            """
            Initialize your data structure here. Set the size of the deque to be k.
            """
            self.cap = k
            self.q = deque(maxlen=k)
    
        def insertFront(self, value: int) -> bool:
            """
            Adds an item at the front of Deque. Return true if the operation is successful.
            """
            if len(self.q) < self.cap:
                self.q.appendleft(value)
                return True
            return False                
    
        def insertLast(self, value: int) -> bool:
            """
            Adds an item at the rear of Deque. Return true if the operation is successful.
            """
            if len(self.q) < self.cap:
                self.q.append(value)
                return True
            return False 
            
    
        def deleteFront(self) -> bool:
            """
            Deletes an item from the front of Deque. Return true if the operation is successful.
            """
            if self.isEmpty():
                return False
            self.q.popleft()
            return True        
    
        def deleteLast(self) -> bool:
            """
            Deletes an item from the rear of Deque. Return true if the operation is successful.
            """
            if self.isEmpty():
                return False
            self.q.pop()
            return True
    
        def getFront(self) -> int:
            """
            Get the front item from the deque.
            """
            if self.isEmpty():
                return -1
            return self.q[0]
    
        def getRear(self) -> int:
            """
            Get the last item from the deque.
            """
            if self.isEmpty():
                return -1
            return self.q[-1]
    
        def isEmpty(self) -> bool:
            """
            Checks whether the circular deque is empty or not.
            """
            return len(self.q) == 0        
    
        def isFull(self) -> bool:
            """
            Checks whether the circular deque is full or not.
            """
            return len(self.q) == self.cap
    
    
    # Your MyCircularDeque object will be instantiated and called as such:
    # obj = MyCircularDeque(k)
    # param_1 = obj.insertFront(value)
    # param_2 = obj.insertLast(value)
    # param_3 = obj.deleteFront()
    # param_4 = obj.deleteLast()
    # param_5 = obj.getFront()
    # param_6 = obj.getRear()
    # param_7 = obj.isEmpty()
    # param_8 = obj.isFull()
    
  • 相关阅读:
    关于JSON可能出现的错误,待更/todo
    mongoose的安装与使用(书签记录) 2017
    HTTP的学习记录3--HTTPS和HTTP
    HTTP的学习记录(二)头部
    HTTP(一)概述
    LeetCode 455. Assign Cookies
    LeetCode 453. Minimum Moves to Equal Array Elements
    LeetCode 448. Find All Numbers Disappeared in an Array
    LeetCode 447. Number of Boomerangs
    LeetCode 416. Partition Equal Subset Sum
  • 原文地址:https://www.cnblogs.com/bonelee/p/12545559.html
Copyright © 2011-2022 走看看