面試題 09 用兩個棧實現隊列(Python3)

用兩個棧實現一個隊列。隊列的聲明如下,請實現它的兩個函數 appendTail 和 deleteHead ,分別完成在隊列尾部插入整數和在隊列頭部刪除整數的功能。(若隊列中沒有元素,deleteHead 操作返回 -1 )

示例 1:

輸入:
["CQueue","appendTail","deleteHead","deleteHead"]
[[],[3],[],[]]
輸出:[null,null,3,-1]


示例 2:

輸入:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]
輸出:[null,-1,null,null,5,2]

原始代碼爲:

class CQueue:

    def __init__(self):

    def appendTail(self, value: int) -> None:

    def deleteHead(self) -> int:


# Your CQueue object will be instantiated and called as such:
# obj = CQueue()
# obj.appendTail(value)
# param_2 = obj.deleteHead()

 

那麼第一個問題來了:讀不懂題!輸入輸出是啥玩意啊

答: 輸入是操作和對應的輸入值.

如操作是appendTail ,則對應的輸入值只能是數字或[]; deleteHead輸入值則只能是[]。

同理, 輸出時,只有deleteHead有返回值,其餘都是null。

具體如下面兩圖所示:

 

解題思路

  • 構造兩個棧(用list表示),一個是A,一個是B;
  • 其中,A的順序與隊列相同,B則與A相反。
  • 當appendTail的時候,A append一個元素,同時更新B(即B=A[::-1])
  • 當deleteHead的時候,去掉隊列的第一個元素即對比進行pop操作並返回pop的值,pop後更新A(即A=B[::-1])即可.當然,若此時B已經是null的,則直接返回-1,且該情況下無須更新A。

 

 

 

 

代碼

class CQueue:

    def __init__(self):
        self.A = [] # 第一個棧,表示隊列
        self.B = [] # 第二個棧,表示隊列的逆(逆隊列)

    def appendTail(self, value: int) -> None:
        # append時只需要在A後面append即可
        self.A.append(value)
        # 除此之外,還要更新B
        self.B = self.A[::-1]

    def deleteHead(self) -> int:
        if self.B:
            result = self.B.pop() # 返回B的第一個元素
            self.A = self.B[::-1]   # 更新A
            return result
        else:   # b是空的,且此時A=B,因此不需要對A判斷且可直接返回-1   
            return -1 

# Your CQueue object will be instantiated and called as such:
# obj = CQueue()
# obj.appendTail(value)
# param_2 = obj.deleteHead()

結果

 

總結

  • append和pop的運用。兩個操作均針對list的尾部,且pop可有返回值;
  • 由兩個棧完成對一個隊列的操作值得注意。
  • 此題在明白題意後書寫起來並不困難,但這也和這幾天做的題有關,繼續堅持吧。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章