循環隊列你學會了嗎?


大家好,我是程序員學長。今天我們來聊一聊循環隊列那些事。

上周群里的小伙伴去面試快手大數據崗位,竟然讓實現一個循環隊列...,今天我們就來分析一下。

Tips: 你也許會有疑問,面試數據崗,為什么還要問這個問題。其實,循環隊列在軟件開發中是經常需要用到了一個技術,比如大數據基石MapReduce中就有環形緩沖區的概念、在Redis主從同步中也用到了環形緩存區。

問題描述

設計一個循環隊列實現。支持如下操作。

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

分析問題

要想了解什么是循環隊列,我們就需要先知道什么是隊列。隊列是一種先進先出(FIFO)的線性數據結構,就和我們排隊買東西一樣,先來的先買,后來的后買。如下圖所示:

image.png

循環隊列是在隊列的基礎上,把隊尾和隊首連接在一起形成一個循環結構。

我們都知道算法是建立在數據結構之上的,要想實現題目要求,我們就需要先確定元素是采用何種數據結構來存儲的。

對於隊列來說,我們一般是采用數組來進行存儲的。所以這里,我們也使用數組來存儲元素。因為數組不是環形結構,只是一種線性的數據結構,所以我們需要通過操作數組的索引來模擬構建一個虛擬的環。

在循環隊列中最主要的就是確定隊列為空和隊列為滿的條件。

image.png

下面我們來看一下代碼的實現。

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

最后

循環隊列的思想比較簡單,最主要的就是確定好臨界點的判斷條件。如果想明白了臨界條件,那實現起來就簡單多了。

更多有趣內容,請關注【程序員學長】。

你知道的越多,你的思維也就越開闊,我們下期再見。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM