232. Implement Queue using Stacks
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
, andempty
).
Idea
-
push into stack_in
-
pop:
-
if stack_out is empty, move from stack_in to stack_out
-
pop from stack out
-
Solution:
class MyQueue:
def __init__(self):
self.stack_in, self.stack_out=[],[]
def push(self, x: int) -> None:
self.stack_in.append(x)
def pop(self) -> int:
if not self.stack_out:
while self.stack_in:
self.stack_out.append(self.stack_in.pop())
return self.stack_out.pop()
def peek(self) -> int:
x=self.pop()
self.stack_out.append(x)
return x
def empty(self) -> bool:
return not self.stack_out and not self.stack_in
-
Note1:
- in->out后,相当于这两个list尾尾拼接,成为一个先进先出的queue
- use list [] and list.pop() to simulate a stack
- pay attention on “self.”
-
Note2:
- list in python
- ls=[1,2,3]
- ls.pop(): 3
- stack
- default index = -1
- ls.pop(0): 1
- queue
- list in python
-
Analysis
- push: time: O(1), space: O(n)
- pop: time O (n), space: O(1)
==================================================
225. Implement Stack using Queues
Implement a last-in-first-out (LIFO) stack using only two queues. The implemented stack should support all the functions of a normal stack (
push
,top
,pop
, andempty
).
Idea
- Move Q1[0:n-2] to Q2, then Q1[n-1] is top
- Q1, Q2 swap
Solution:
- Version 1: list
# 1. use list: q.append(); q.pop(0)
class MyStack:
def __init__(self):
self.q_fill, self.q_empty = [], []
def push(self, x: int) -> None:
self.q_fill.append(x)
def pop(self) -> int:
for i in range(len(self.q_fill)-1):
self.q_empty.append(self.q_fill.pop(0))
self.q_fill, self.q_empty = self.q_empty, self.q_fill
return self.q_empty.pop(0)
def top(self) -> int:
res=self.pop()
self.q_fill.append(res)
return res
def empty(self) -> bool:
return not self.q_fill
-
Note: use list: q.append(); q.pop(0)
-
Version 2: deque
# 2. use deque: q.append();q.popleft()
from collections import deque
class MyStack:
def __init__(self):
self.q_in, self.q_out = deque(),deque()
def push(self, x: int) -> None:
self.q_in.append(x)
def pop(self) -> int:
for i in range(len(self.q_in)-1):
self.q_out.append(self.q_in.popleft())
self.q_in, self.q_out = self.q_out, self.q_in
return self.q_out.popleft()
def top(self) -> int:
res=self.pop()
self.q_in.append(res)
return res
def empty(self) -> bool:
return not self.q_in
- Note:
- use deque: q.append();q.popleft()
- from collections import deque