Implement Queue using Stacks
franklinqin0 DesignStackQueue
# Solution
Solve using two stacks.
# Vanilla Two Stacks
Code is omitted but here is the explanation:
__init__: initializes1as the main stack ands2as auxiliarypush: add the newly pushed element to the bottom ofs1- move all
s1tos2 - push the new element to
s1 - move back old elements from
s2tos1
- move all
All other operations are quite straightforward and have constant time and space complexities.
Complexity for `push`
time:
space: due to additional space taken by s2
# Improved Two Stacks
The new element is always pushed to s1. Pop elements from s2. If s2 is empty, _move all elements from s1 to s2.
Complexity for `pop`
time: amortized (worst case )
space: due to additional space taken by s2
- normal case: if
s2is not empty,popfroms2 - worst case: if
s2is empty,_movedoesn't pops1and append tos2
All other operations are quite straightforward and have constant time and space complexities.
class MyQueue:
def __init__(self):
"""
Initialize your data structure here.
"""
self.s1 = []
self.s2 = []
def push(self, x: int) -> None:
"""
Push element x to the back of queue.
"""
self.s1.append(x)
def pop(self) -> int:
"""
Removes the element from in front of queue and returns that element.
"""
self._move()
return self.s2.pop()
def peek(self) -> int:
"""
Get the front element.
"""
self._move()
return self.s2[-1]
def empty(self) -> bool:
"""
Returns whether the queue is empty.
"""
return not self.s1 and not self.s2
def _move(self) -> None:
if not self.s2:
while self.s1:
self.s2.append(self.s1.pop())
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39