栈和队列相互实现
题目一 队列实现栈
要求:使用队列实现栈的下列操作:push(x),pop(),top(),empty()
方法:利用双队列deque实现栈,操作方便,效率较高
思路:(1)push()操作,为了保证先进栈的元素一直在栈底,需要将两个队列交替使用,才可满足需求,所以我们在空的队列添加元素,然后将非空队列的元素全部追加到当前队列,然后方便下次添加元素至空队列。
(2)pop()操作,在添加元素时,我们已经按照进栈的先后顺序把新进栈的元素放在一个队列的头部,所以出栈时,我们只需找到非空的队列将数据依次取出。
(3)top()操作,需将顶部元素取出,将入栈元素依次出栈,再将所要数据取出即可
code
class Solution:
def __init__(self):
self.q1 = []
self.q2 = []
def push(self, x:int):
self.q1.append(x)
def pop(self):
if len(self.q1) == 0:
print('empty')
if len(self.q1) == 1:
return self.q1.pop(0)
while len(self.q1) > 1:
self.q2.append(self.q1.pop(0))
res = self.q1.pop(0)
self.q1, self.q2 = self.q2, self.q1
return res
def top(self):
while len(self.q1) != 1:
self.q2.append(self.q1.pop(0))
res = self.q1.pop(0)
self.q2.append(res)
return res
def empty(self):
return not bool(self.q1)
题目二 栈实现队列
要求:使用栈实现队列的下列操作:push(x),pop(),peek(),empty()
方法:使用两个栈实现队列,操作高效简洁
思路:入1栈的特点是FILO,所以来回操作两次,就可变成队列。入栈时,直接进stack1栈,出栈时,先看stack2中是否有元素,如果有,则直接输出,如果没有,将1栈元素依次排进2栈后,再进行输出。
code
class Solution:
def __init__(self):
self.stack1 = []
self.stack2 = []
def push(self, x:int):
self.stack1.append(x)
def pop(self):
if self.empty():
return None
if len(self.stack2) > 0:
return self.stack2.pop()
else:
while len(self.stack1) > 0:
self.stack2.append(self.stack1.pop())
return self.stack2.pop()
def top(self):
if self.empty():
return None
if len(self.stack2) > 0:
return self.stack2[-1]
else:
while len(self.stack1) > 0:
self.stack2.append(self.stack1.pop())
return self.stack2[-1]
def empty(self):
if len(self.stack1) == 0 and len(self.stack2) == 0:
return True
else:
return False
注 理解list函数中pop()操作的真正含义:
(1)pop(0):其意义是输出list中的首元素,实现队列效果。
(2)pop()/pop(-1):其意义是输出list中的末尾元素,实现栈效果。