今日任务:
1)232.用栈实现队列
2)225.用队列实现栈
232.用栈实现队列
题目链接:232. 用栈实现队列 - 力扣(LeetCode)
文章讲解:代码随想录 (programmercarl.com)
视频讲解:栈的基本操作! | LeetCode:232.用栈实现队列哔哩哔哩bilibili
思路:
比较简单,没什么好说,就是用两个栈控制,当要pop或者top时,就把进栈中的数pop出来,用另一个存起来,这样栈中的数就反转了
当要模仿队列FIFO时,1先2后。所以pop时因该先出1,后出2。而栈中是先进后出,反过来了,所以当要pop时,我们那利用第二个栈将数反过来即可
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 == []:
while self.stack_in:
self.stack_out.append(self.stack_in.pop())
return self.stack_out.pop()
def peek(self) -> int:
tmp = self.pop()
self.stack_out.append(tmp)
return tmp
def empty(self) -> bool:
return True if self.stack_out==[] and self.stack_in==[] else False
225.用队列实现栈
题目链接:225. 用队列实现栈 - 力扣(LeetCode)
文章讲解:代码随想录 (programmercarl.com)
视频讲解:队列的基本操作! | LeetCode:225. 用队列实现栈哔哩哔哩bilibili
思路:
用python的deque中pop与栈的功能一样,简直就是作弊哈哈哈哈,这里也不写了
如果要严格按队列先进先出,那换成popleft来做
法一:
思想比较简单,添加元素存放在队列中,当要提出或者展示第一个元素时,栈是返回最后进入的元素,而队列是返回最先进入的元素,所以,当要提出或者展示第一个元素时,我们先把队列中前面的元素用另一个队列存起来,只留最后一个元素返回即可
from collections import deque
class MyStack:
def __init__(self):
self.queue1 = deque()
self.queue2 = deque()
def push(self, x: int) -> None:
self.queue1.append(x)
def pop(self) -> int:
if self.empty():
return None
while len(self.queue1) > 1:
self.queue2.append(self.queue1.popleft())
tmp = self.queue1.popleft()
self.queue1, self.queue2 = self.queue2, self.queue1
return tmp
def top(self) -> int:
if self.empty():
return None
while len(self.queue1) > 1:
self.queue2.append(self.queue1.popleft())
tmp = self.queue1.popleft()
self.queue2.append(tmp)
self.queue1, self.queue2 = self.queue2, self.queue1
return tmp
def empty(self) -> bool:
return False if self.queue1 else True
思路:
法二:
这里只采用一个队列实现,记录队列的长度,每pop出一个元素,便重新添加到队列末尾,直到最后一个pop出来,前面的已经重新添加在原最后一个元素后面。
class MyStack:
def __init__(self):
self.queue = deque()
def push(self, x: int) -> None:
self.queue.append(x)
def pop(self) -> int:
if self.empty():
return None
for i in range(len(self.queue)-1):
self.queue.append(self.queue.popleft())
return self.queue.popleft()
def top(self) -> int:
if self.empty():
return None
for i in range(len(self.queue) - 1):
p = self.queue.popleft()
self.queue.append(p)
tmp = self.queue.popleft()
self.queue.append(tmp)
return tmp
def empty(self) -> bool:
return False if self.queue else True
感想:今天题不难,可以加深对栈,队列的理解,写的时候细心点,便没什么问题


1128

被折叠的 条评论
为什么被折叠?



