队列和栈基础知识
栈
OMG本人学C的时候就没搞懂,现在看C++看懂了一点,总结一下:
1、所有元素必须符合先进后出规则;
2、所以栈不提供走访功能,也不提供迭代器(iterator);
3、STL中栈往往不被归类为容器,而被归类为container adapter(容器适配器)。栈是以底层容器完成其所有的工作,对外提供统一的接口,底层容器是可插拔的(也就是说我们可以控制使用哪种容器来实现栈的功能);
4、常用的SGI STL,如果没有指定底层实现的话,默认是以deque为缺省情况下栈的底层结构。(封住一端)。
队列
1、队列中先进先出的数据结构;
2、同样不允许有遍历行为,不提供迭代器;
3、SGI STL中队列一样是以deque为缺省情况下的底部结构;
4、STL 队列也不被归类为容器,而被归类为container adapter( 容器适配器)。
232. 用栈实现队列
可以把队列看成是两头开的栈,也可以理解是两个背靠背的栈,在输入输出过程完成了一次copy元素。
class MyQueue(object):
def __init__(self):
self.in_stack = []
self.out_stack = []
def push(self, x):
"""
:type x: int
:rtype: None
"""
self.in_stack.append(x)
def pop(self):
"""
:rtype: int
"""
if self.empty():
return None
if self.out_stack:
return self.out_stack.pop()
else:
for i in range(len(self.in_stack)):
self.out_stack.append(self.in_stack.pop())
return self.out_stack.pop()
def peek(self):
"""
:rtype: int
"""
ans = self.pop()
self.out_stack.append(ans)
return ans
def empty(self):
"""
:rtype: bool
"""
return not (self.in_stack or self.out_stack)
225. 用队列实现栈
class MyStack(object):
def __init__(self):
self.que = deque()
def push(self, x):
"""
:type x: int
:rtype: None
"""
self.que.append(x)
def pop(self):
"""
:rtype: int
"""
# 只需要把全部的弹出之后再接过来
if self.empty():
return None
else:
for i in range(len(self.que) - 1):
self.que.append(self.que.popleft())
return self.que.popleft()
def top(self):
"""
:rtype: int
"""
if self.empty():
return None
else:
return self.que[-1]
def empty(self):
"""
:rtype: bool
"""
return not self.que
第10天结束🎉