使用棧實現隊列的下列操做:程序員
push(x) -- 將一個元素放入隊列的尾部。 pop() -- 從隊列首部移除元素。 peek() -- 返回隊列首部的元素。 empty() -- 返回隊列是否爲空。
示例:算法
MyQueue queue = new MyQueue(); queue.push(1); queue.push(2); queue.peek(); // 返回 1 queue.pop(); // 返回 1 queue.empty(); // 返回 false
說明:app
設計時使用兩個棧
一個棧做爲壓入棧,記爲stack_in
一個棧做爲彈出棧,記爲stack_out設計
1.當有數據入隊列時,壓入stack_incode
2.當有數據出隊列時,從stack_out彈出,若是stack_out爲空,則循環遍歷stack_in,將stack_in中的元素所有彈出,並按彈出順序所有壓入棧stack_out,循環結束後從stack_out彈出棧頂元素便可隊列
class MyQueue: def __init__(self): """ Initialize your data structure here. """ self.stack_in = [] self.stack_out = [] def push(self, x: int) -> None: """ Push element x to the back of queue. """ self.stack_in.append(x) def pop(self) -> int: """ Removes the element from in front of queue and returns that element. """ if not self.stack_out: while self.stack_in: self.stack_out.append(self.stack_in.pop()) return self.stack_out.pop() else: return self.stack_out.pop() def peek(self) -> int: """ Get the front element. """ if not self.stack_out: while self.stack_in: self.stack_out.append(self.stack_in.pop()) return self.stack_out[-1] else: return self.stack_out[-1] def empty(self) -> bool: """ Returns whether the queue is empty. """ if self.stack_out or self.stack_in: return False else: return True
入隊內存
時間複雜度:O(1):向棧壓入元素的時間複雜度爲O(1)element
空間複雜度:O(n):須要額外的內存來存儲隊列元素it
出隊class
時間複雜度: 攤還複雜度 O(1),最壞狀況下的時間複雜度 O(n)
在最壞狀況下,stack_out爲空,算法須要從 stack_in 中彈出 n 個元素,而後再把這 n個元素壓入 stack_out
空間複雜度 :O(1)
公衆號:《程序員養成記》
主要寫算法、計算機基礎之類的文章, 有興趣來關注一塊兒成長!