大家好,我是程序員學長。今天我們來聊一聊循環隊列那些事。
上周群里的小伙伴去面試快手大數據崗位,竟然讓實現一個循環隊列...,今天我們就來分析一下。
Tips: 你也許會有疑問,面試數據崗,為什么還要問這個問題。其實,循環隊列在軟件開發中是經常需要用到了一個技術,比如大數據基石MapReduce中就有環形緩沖區的概念、在Redis主從同步中也用到了環形緩存區。
問題描述
設計一個循環隊列實現。支持如下操作。
MyCircularQueue(k): 構造器,設置隊列長度為 k 。
Front: 從隊首獲取元素。如果隊列為空,返回 -1 。
Rear: 獲取隊尾元素。如果隊列為空,返回 -1 。
enQueue(value): 向循環隊列插入一個元素。如果成功插入則返回真。
deQueue(): 從循環隊列中刪除一個元素。如果成功刪除則返回真。
isEmpty(): 檢查循環隊列是否為空。
isFull(): 檢查循環隊列是否已滿。
分析問題
要想了解什么是循環隊列,我們就需要先知道什么是隊列。隊列是一種先進先出(FIFO)的線性數據結構,就和我們排隊買東西一樣,先來的先買,后來的后買。如下圖所示:
循環隊列是在隊列的基礎上,把隊尾和隊首連接在一起形成一個循環結構。
我們都知道算法是建立在數據結構之上的,要想實現題目要求,我們就需要先確定元素是采用何種數據結構來存儲的。
對於隊列來說,我們一般是采用數組來進行存儲的。所以這里,我們也使用數組來存儲元素。因為數組不是環形結構,只是一種線性的數據結構,所以我們需要通過操作數組的索引來模擬構建一個虛擬的環。
在循環隊列中最主要的就是確定隊列為空和隊列為滿的條件。
下面我們來看一下代碼的實現。
class MyCircularQueue(object):
def __init__(self, k):
self.queue = [0]*k
self.head = 0
self.tail = 0
self.capacity = k
def enQueue(self, value):
#入隊
#判斷隊列是否滿
if self.head==(self.tail+1)%self.capacity:
return False
self.queue[self.tail] = value
self.tail=(self.tail+1)%self.capacity
return True
def deQueue(self):
#出隊
if self.head == self.tail:
return False
self.head=(self.head+1)%self.capacity
return True
def Front(self):
#隊首元素
if self.head == self.tail:
return -1
return self.queue[self.head]
def Rear(self):
#隊尾元素
#判斷是否為空
if self.head == self.tail:
return -1
return self.queue[self.tail-1]
def isEmpty(self):
return self.head == self.tail
def isFull(self):
return self.head == (self.tail+1)%self.capacity
最后
循環隊列的思想比較簡單,最主要的就是確定好臨界點的判斷條件。如果想明白了臨界條件,那實現起來就簡單多了。
更多有趣內容,請關注【程序員學長】。
你知道的越多,你的思維也就越開闊,我們下期再見。