問題描述
設計你的循環隊列實現。 循環隊列是一種線性數據結構,其操做表現基於 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())