1.题目描述
题目一:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
题目二:用两个队列来实现一个栈,完成队列的Push和Pop操作。 队列中的元素为int类型。
2.思路分析
【题目一】
题目一很直白,栈的先入后出,来两次,不就成队列了。
入栈:直接进A栈
出栈:首先判断B栈是否有元素,有就直接输出
若没有,就将A栈的元素全部出栈再进B栈,再输出
【题目二】
题目二,两个队列如果按常规操作是肯定没法产生栈的效果的
入队:将新元素存入不为空的队列
出队:找到不为空的队列,出队进第二个队列,直至只有一个元素,输出该元素
特殊:需要考虑两个都为空的情况,直接输出None
3.代码
【题目一】两个栈实现队列
class Solution:
def __init__(self):
self.stack1=[]
self.stack2=[]
def push(self,node):
#入栈,直接往A栈存
self.stack1.append(node)
def pop(self):
#出栈,如果B有元素,直接输出
#如果,如果A只有元素,A出栈进B栈,再输出
if len(self.stack1)==0 and len(self.stack2)==0:
return None
if len(self.stack2)>0:
return self.stack2.pop()
elif len(self.stack1)>1:
while len(self.stack1):
self.stack2.append(self.stack1.pop())
return self.stack2.pop()
【题目二】两个队列实现一个栈
class Solution:
def __init__(self):
self.queue1=[]
self.queue2=[]
def push(self,node):
#选择一个不为空的队列入队
if len(self.queue1)>0:
self.queue1.append(node)
elif len(self.queue2)>0:
self.queue2.append(node)
else:
self.queue1.append(node)
def pop(self):
"""将有元素的队列出队,直至只有一个元素"""
#如果都是空
if len(self.queue1)<1 and len(self.queue2)<1:
return None
if len(self.queue1)>0:
while len(self.queue1)>1:
self.queue2.append(self.queue1.pop(0))
return self.queue1.pop(0)
else:
while len(self.queue2)>1:
self.queue1.append(self.queue2.pop(0))
return self.queue2.pop(0)
if __name__=="__main__":
ss=Solution()
ss.push(1)
ss.push(2)
print(ss.pop())
ss.push(3)
ss.push(4)
ss.push(5)
4.知识点
理解list中的内置函数pop()的真正意义:
- pop(0),输出list中的首元素,其意义就是队列的效果
- pop()/pop(-1),输出list中的末尾元素,其意义就是栈的效果
网友评论