leetcode--232:(栈和队列)Implement Queue using Stacks
# 2019.7.12:
我的思路:
很明显,一个栈是做不到的,只能建立两个栈s1和s2。栈的实现可以用deque(题目说的),那就很简单实现了。然后两个栈如何分配呢?我们先看栈能用哪些方法:
- push(item) 添加一个新的元素item到栈顶
- pop() 弹出栈顶元素
- is_empty() 判断栈是否为空
- size() 返回栈的元素个数(用不到)
- top()返回栈顶元素
再看队列需要实现的方法:
1. push(x):把x放入queue尾部--push进s1中
2. pop():移除队列第一个元素--如果s2为空,把s1的元素全部pop出来再push到s2中,然后s2栈顶就是队列最早进来的元素,pop即可
3. peek():获取第一个元素--类似pop()
4. empty():判断队列是否为空--s1和s2同时为空的时候就返回true
我的答案:
from collections import deque class Stack: def __init__(self): self.items = deque() # 创建一个deque实例 def push(self, x): return self.items.append(x) def pop(self): return self.items.pop() def top(self): return self.items[-1] def is_empty(self): return len(self.items) == 0 class MyQueue: def __init__(self): """ Initialize your data structure here. """ self.s1 = Stack() self.s2 = Stack() def push(self, x: int) -> None: """ Push element x to the back of queue. """ self.s1.push(x) def pop(self) -> int: """ Removes the element from in front of queue and returns that element. """ if self.s2.is_empty(): while not self.s1.is_empty(): val = self.s1.pop() self.s2.push(val) return self.s2.pop() def peek(self) -> int: """ Get the front element. """ if self.s2.is_empty(): while not self.s1.is_empty(): val = self.s1.pop() self.s2.push(val) return self.s2.top() def empty(self) -> bool: """ Returns whether the queue is empty. """ return self.s1.is_empty() and self.s2.is_empty()