622. 設計循環隊列

問題描述

設計你的循環隊列實現。 循環隊列是一種線性數據結構,其操做表現基於 FIFO(先進先出)原則而且隊尾被鏈接在隊首以後以造成一個循環。它也被稱爲「環形緩衝器」。python

循環隊列的一個好處是咱們能夠利用這個隊列以前用過的空間。在一個普通隊列裏,一旦一個隊列滿了,咱們就不能插入下一個元素,即便在隊列前面仍有空間。可是使用循環隊列,咱們能使用這些空間去存儲新的值。數據結構

你的實現應該支持以下操做:this

  • MyCircularQueue(k): 構造器,設置隊列長度爲 k 。
  • Front: 從隊首獲取元素。若是隊列爲空,返回 -1 。
  • Rear: 獲取隊尾元素。若是隊列爲空,返回 -1 。
  • enQueue(value): 向循環隊列插入一個元素。若是成功插入則返回真。
  • deQueue(): 從循環隊列中刪除一個元素。若是成功刪除則返回真。
  • isEmpty(): 檢查循環隊列是否爲空。
  • isFull(): 檢查循環隊列是否已滿。

解決方案

隊列的存儲結構中使用的最多的是循環隊列。循環隊列包括兩個指針, front 指針指向隊頭元素, rear 指針指向隊尾元素的下一個位置。 隊列爲空的判斷條件是:front == rear 隊列滿的判斷條件是:(rear+1)%maxsize == front 隊列長度的計算公式:(rear-front+maxsize)%maxsizespa

正常狀況下當front == rear是隊列有多是滿也有多是空,爲了區分這兩種狀況 咱們須要在front前添加一個閒置單元。設計

show me the code指針

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@Author    : Young
@Email     : hyc554@outlook.com
@site      : http://www.cnblogs.com/huang-yc/
@File      : mycircularqueue.py
@version   : 1.0
@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())
相關文章
相關標籤/搜索