用兩個棧實現一個隊列。隊列的聲明如下,請實現它的兩個函數 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可有返回值;
- 由兩個棧完成對一個隊列的操作值得注意。
- 此題在明白題意後書寫起來並不困難,但這也和這幾天做的題有關,繼續堅持吧。