队列:先进先出
栈:先进后出
232.用栈实现队列
**思路:**一个in栈,一个out栈
重点:
(1)pop操作:这个过程是如果stackout里面有值,说明队列先进先出的还在里面;如果stackout没有值了,那就重新出栈转移这个过程
(2)peek查看队列顶部操作:注意pop出来的元素要返回的是stack_out!!所以相当于pop进来再用append给push进去
(3)对于列表list的pop:默认值是pop(-1)也就是删除最后一个元素,所以append是能把他再返回来的!但是也可以写pop(0)相当于队列的操作
class MyQueue:
def __init__(self):
self.stack_in = []
self.stack_out = []
def push(self, x: int) -> None:
self.stack_in.append(x)
# print('stack_in',self.stack_in)
def pop(self) -> int:
'''
这个过程是如果stackout里面有值,说明队列先进先出的还在里面
如果stackout没有值了,那就重新出栈转移这个过程
'''
if self.empty():
return None
if self.stack_out:
return self.stack_out.pop()
else:
for i in range(len(self.stack_in)):
self.stack_out.append(self.stack_in.pop())
print('stack_in',self.stack_in, 'self.stack_out', self.stack_out)
return self.stack_out.pop()
def peek(self) -> int:
ans = self.pop()
self.stack_out.append(ans)
return ans
def empty(self) -> bool:
return not (self.stack_in or self.stack_out)
225. 用队列实现栈
思路:其实这道题目就是用一个队列就够了。一个队列在模拟栈弹出元素的时候只要将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部,此时再去弹出元素就是栈的顺序了。也就是长度为k,弹出k-1个再返回队尾就是栈的先进后出了!
一些补充:Python collections模块之deque详解,collections又提供了一些常用容器
collections模块常用类型有:原文链接:Python collections模块之deque()详解_python collections.deque-CSDN博客
- 双向队列(deque):类似于list的容器,可以快速的在队列头部和尾部添加、删除元素
- 计数器(Counter):dict的子类,计算可hash的对象
- 默认字典(defaultdict):dict的子类,可以调用提供默认值的函数
- 有序字典(OrderedDict):dict的子类,可以记住元素的添加顺序
- 可命名元组(namedtuple):可以创建包含名称的tuple
针对于deque双端队列的一些用法:
- append():从右端添加元素(
与list同
)
st = "abcd"
list1 = [0, 1, 2, 3]
dst = deque(st)
dlist1 = deque(list1)
dst.append(4)
dlist1.append("k")
print(dst)
print(dlist1)
#结果:
#deque(['a', 'b', 'c', 'd', 4])
#deque([0, 1, 2, 3, 'k'])
- appendleft():从左端添加
- pop():移除列表中的一个元素(默认最右端的一个元素),并且返回该元素的值(
与list同
),如果没有元素,将会报出IndexError
from collections import deque
st = "abcd"
list1 = [0, 1, 2, 3]
dst = deque(st)
dlist1 = deque(list1)
p = dst.pop()
p1 = dlist1.pop()
print(p)
print(p1)
print(dst)
print(dlist1)
#结果:
#d
#3
#deque(['a', 'b', 'c'])
#deque([0, 1, 2])
- popleft():移除左端的元素
- count():统计元素总个数
- **insert(index,obj):**在指定位置插入元素
- rotate(n):从右侧反转n步,如果n为负数,则从左侧反转
from collections import deque
st = "abbcd"
dst = deque(st)
dst.rotate(1)
print(dst)
#结果:
#deque(['d', 'a', 'b', 'b', 'c'])
本题代码:
from collections import deque
class MyStack:
def __init__(self):
self.que = deque()
def push(self, x: int) -> None:
self.que.append(x)
def pop(self) -> int:
if self.empty():
return None
for i in range(len(self.que)-1):
self.que.append(self.que.popleft())
return self.que.popleft()
def top(self) -> int:
if self.empty():
return None
for i in range(len(self.que)-1):
self.que.append(self.que.popleft())
temp = self.que.popleft()
self.que.append(temp)
return temp
def empty(self) -> bool:
return not self.que
# Your MyStack object will be instantiated and called as such:
# obj = MyStack()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.top()
# param_4 = obj.empty()