Day10|栈与队列理论基础, 232.用栈实现队列, 225. 用队列实现栈
理论基础
栈(stack):先进后出
队列(queue):先进先出
栈
Python中栈可以用list实现:
进栈:append()
出栈:pop()
查看栈顶:list[-1]
队列
用python的list模拟队列,效率太低,时间复杂度为O(n)
Python的deque模块可以实现队列,并且支持双向队列
创建双向队列:queue = deque([1,2,3,4])
进入队列:append()
出队列:popleft()
从队首进入队列:appendleft()
从队尾出队列:pop()
队列的首个元素:queue[0]
队列的最后一个元素:queue[-1]
232.用栈实现队列
思路
用deque
实现队列的各种操作
python中无法按照题目的思路来完成用栈实现队列的操作。
问题:不知道一开始在class中如何初始化一个list
class MyQueue:
def __init__(self):
self.queue = deque([])
def push(self, x: int) -> None:
self.queue.append(x)
def pop(self) -> int:
return self.queue.popleft()
def peek(self) -> int:
return self.queue[0]
def empty(self) -> bool:
if len(self.queue) == 0:
return True
else:
return False
在init中初始化的变量,后面的方法使用时,需要加self
。
注意:
- 由于题目需要用栈实现队列,这里写的完全时用队列实现,并不能按照题目的思路实现。
实际上,在python中可以用list代表栈,并且用这里的栈实现队列 - 利用栈实现队列时,出栈可以先讲栈中全部的元素放入另一个栈里,即将栈中全部元素颠倒,再出栈。
- peek函数返回队列开头的元素,此时并不知道之前有没有执行过pop函数,因此不能直接返回list[0]的元素,而是用这里的pop函数得到队列的第一个元素,再把该元素push到stack_out的栈里。
最终代码:
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 self.stack_out:
return self.stack_out.pop()
else:
for i in range(len(self.stack_in)):
tmp = self.stack_in.pop()
self.stack_out.append(tmp)
return self.stack_out.pop()
def peek(self) -> int:
result = self.pop()
self.stack_out.append(result)
return result
def empty(self) -> bool:
if len(self.stack_in) == 0 and len(self.stack_out) == 0:
return True
else:
return False
225. 用队列实现栈
思路
一个双向队列的操作完全可以实现栈的各种操作
class MyStack:
def __init__(self):
self.queue = deque([])
def push(self, x: int) -> None:
self.queue.append(x)
def pop(self) -> int:
return self.queue.pop()
def top(self) -> int:
return self.queue[-1]
def empty(self) -> bool:
if len(self.queue) == 0:
return True
else:
return False
注意:
如果只是用队列来实现栈,则pop函数不能直接写为queue.pop()
此时,可以讲队列中的size - 1
个元素弹出,并再次加入到队列,最后从队列中弹出的元素就是队列末尾的元素。
此时的pop函数代码:
def pop(self) -> int:
if self.empty():
return None
for i in range(len(self.queue) - 1):
tmp = self.queue.popleft()
self.queue.append(tmp)
return self.queue.popleft()