zoukankan      html  css  js  c++  java
  • 设计循环队列


    问题描述

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

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

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

    • MyCircularQueue(k): 构造器,设置队列长度为 k 。
    • Front: 从队首获取元素。如果队列为空,返回 -1 。
    • Rear: 获取队尾元素。如果队列为空,返回 -1 。
    • enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。
    • deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。
    • isEmpty(): 检查循环队列是否为空。
    • isFull(): 检查循环队列是否已满。

    解决方案

    队列的存储结构中使用的最多的是循环队列。循环队列包括两个指针, front 指针指向队头元素, rear 指针指向队尾元素的下一个位置。
    队列为空的判断条件是:front == rear
    队列满的判断条件是:(rear+1)%maxsize == front
    队列长度的计算公式:(rear-front+maxsize)%maxsize

    正常情况下当front == rear是队列有可能是满也有可能是空,为了区分这两种情况 我们需要在front前添加一个闲置单元。

    show me the code

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    """
    @Time      : 2019/4/11 20:06
    Description about this file:
    
    """
    
    
    class MyCircularQueue:
    
        def __init__(self, k: int):
            """
            Initialize your data structure here. Set the size of the queue to be k.
            """
            self.queue = [None] * (k + 1)
            self.maxsize = k + 1
            self.front = 0
            self.tail = 0
    
        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.queue[self.tail] = value
            self.tail = (self.tail + 1) % self.maxsize
            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.queue[self.front] = None
            self.front = (self.front + 1) % self.maxsize
            return True
    
        def Front(self) -> int:
            """
            Get the front item from the queue.
            """
    
            if self.isEmpty():
                return -1
            return self.queue[self.front]
    
        def Rear(self) -> int:
            """
            Get the last item from the queue.
            """
            if self.isEmpty():
                return -1
            return self.queue[self.tail-1]
    
        def isEmpty(self) -> bool:
            """
            Checks whether the circular queue is empty or not.
            """
            return self.front == self.tail
    
        def isFull(self) -> bool:
            """
            Checks whether the circular queue is full or not.
            """
            return (self.tail + 1) % self.maxsize == self.front
    
    
    if __name__ == '__main__':
        a =MyCircularQueue(3)
        print(a.enQueue(1))
        print(a.enQueue(2))
        print(a.enQueue(3))
        print(a.enQueue(4))
        print(a.Rear())
        print(a.isFull())
        print(a.deQueue())
        print(a.enQueue(4))
        print(a.Rear())
        print(a.queue)
        print(a.Front())
    
    
  • 相关阅读:
    针对.NET开发者的NuoDB 1.1发布
    用于.NET的可移植HTTP客户端
    Mono Libgdiplus库
    基于Bootstrap Metro 界面风格开发框架 MetroBootstrap
    对C# 程序员来说现在是到目前为止最好的时代
    Xamarin Evolve 2013
    Visual Studio 必备可视化插件推荐
    SQL Server 2008 R2 SP2官方下载地址
    ASP.NET Web API对OData的支持
    在CentOS 6.3下安装OpenPetra 的 Mono 3.0.6 部署包
  • 原文地址:https://www.cnblogs.com/quegai18/p/10715399.html
Copyright © 2011-2022 走看看