動機
很經典,但沒想過可以用兩個stack
Problem
Implement a first in first out (FIFO) queue using only two stacks. The implemented queue should support all the functions of a normal queue (push
, peek
, pop
, and empty
).
Implement the MyQueue
class:
void push(int x)
Pushes element x to the back of the queue.int pop()
Removes the element from the front of the queue and returns it.int peek()
Returns the element at the front of the queue.boolean empty()
Returnstrue
if the queue is empty,false
otherwise.
Notes:
- You must use only standard operations of a stack, which means only
push to top
,peek/pop from top
,size
, andis empty
operations are valid. - Depending on your language, the stack may not be supported natively. You may simulate a stack using a list or deque (double-ended queue) as long as you use only a stack's standard operations.
Follow-up: Can you implement the queue such that each operation is amortized O(1)
time complexity? In other words, performing n
operations will take overall O(n)
time even if one of those operations may take longer.
Example 1:
Input[MyQueue, push, push, peek, pop, empty][[], [1], [2], [], [], []]Output[null, null, null, 1, 1, false]ExplanationMyQueue myQueue = new MyQueue();myQueue.push(1); // queue is: [1]myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue)myQueue.peek(); // return 1myQueue.pop(); // return 1, queue is [2]myQueue.empty(); // return false
Constraints:
1 <= x <= 9
- At most
100
calls will be made topush
,pop
,peek
, andempty
. - All the calls to
pop
andpeek
are valid.
Sol
這裡是用一個stack去跑
用兩個stack就是一個負責pop的入,一個負責top的read,當需要pop時pop得stack是空的,就從另外一邊搬
class MyQueue:
def __init__(self):
"""
Initialize your data structure here.
"""
self.stk = []
def push(self, x: int) -> None:
"""
Push element x to the back of queue.
"""
self.stk.append(x)
def pop(self) -> int:
"""
Removes the element from in front of queue and returns that element.
"""
tmpS = []
while len(self.stk) > 1:
tmpS.append(self.stk.pop())
ret = self.stk.pop()
while tmpS:
self.stk.append(tmpS.pop())
return ret
def peek(self) -> int:
"""
Get the front element.
"""
tmpS = []
while len(self.stk) > 1:
tmpS.append(self.stk.pop())
ret = self.stk.pop()
tmpS.append(ret)
while tmpS:
self.stk.append(tmpS.pop())
return ret
def empty(self) -> bool:
"""
Returns whether the queue is empty.
"""
return not self.stk