題目:用兩個棧實現隊列
具體描述:
用兩個棧實現一個隊列。隊列的聲明如下,請實現它的兩個函數 appendTail 和 deleteHead ,分別完成在隊列尾部插入整數和在隊列頭部刪除整數的功能。(若隊列中沒有元素,deleteHead 操作返回 -1 )
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
題解前若無思路可看這裏漫畫更清晰
題解:
class CQueue:
def __init__(self):
self.stack1=[] #基本棧
self.stack2=[] #輔助棧
def appendTail(self, value: int) -> None:
self.stack1.append(value) #元素放入基本棧
def deleteHead(self) -> int:
# 將基本棧的元素放入輔助棧,基本棧後進元素先放入輔助棧
if len(self.stack2) == 0:
while len(self.stack1) != 0:
self.stack2.append(self.stack1.pop())
# 從輔助棧放出元素
if len(self.stack2) != 0:
return(self.stack2.pop())
return(-1)
# Your CQueue object will be instantiated and called as such:
# obj = CQueue()
# obj.appendTail(value)
# param_2 = obj.deleteHead()
複雜度分析
(1)插入元素
時間複雜度:O(1)。向基本棧插入一個元素,在隊列尾部插入元素,使用常數時間。
空間複雜度:O(1)。向基本棧插入一個元素,使用常數空間。
(2)刪除元素
時間複雜度:O(n)。基本棧的元素要刪除並插入到輔助棧,是線性時間複雜度。
空間複雜度:O(n)。需要額外空間儲存元素。
力扣官方給的題解插入刪除元素複雜度正好和上述相反,其將棧元素刪除壓入至輔助棧放入appendTail插入元素步,個人理解中,對於刪除操作少的,插入元素操作多的,將appendTail更簡單更好一些