思路:
1.进栈:那个队列不为空就进那个队列,都为空时随便进哪个都行
2.出栈:
- 先将不为空的队列中的元素依次出队,并入队到另一个空队列中,剩余最后一个为出栈的元素.
- 如果两个队列都为空,则栈空.
用列表模拟队列,实现栈:
class Stack:
def __init__(self):
self.q1=[]
self.q2=[]
def push(self,item):
if self.q1:
self.q1.append(item)
elif self.q2:
self.q2.append(item)
else:
self.q1.append(item)
def pop(self):
if not self.q1 and self.q2: # q1空 q2不空
while len(self.q2)>1:
self.q1.append(self.q2.pop(0))
return self.q2.pop(0)
elif not self.q2 and self.q1: # q1不空 q2空
while len(self.q1)>1:
self.q2.append(self.q1.pop(0))
return self.q1.pop(0)
else :
raise ValueError("Stack Empty")
测试:
s=Stack()
s.push(1)
s.push(2)
print(s.pop())
print(s.pop())
s.push(3)
s.push(4)
print(s.pop())
s.push(5)
print(s.pop())
print(s.pop())
结果依次为: 2 1 4 5 3
用queue模块中的Queue,实现栈:
from queue import Queue
class Stack:
def __init__(self):
self.q1=Queue()
self.q2=Queue()
def push(self,item):
if self.q1.qsize():
self.q1.put(item)
elif self.q2.qsize():
self.q2.put(item)
else:
self.q1.put(item)
def pop(self):
if not self.q1.qsize() and self.q2.qsize(): # q1空 q2不空
while self.q2.qsize()>1:
self.q1.put(self.q2.get())
return self.q2.get()
elif not self.q2.qsize() and self.q1.qsize(): # q1不空 q2空
while self.q1.qsize()>1:
self.q2.put(self.q1.get())
return self.q1.get()
else :
raise ValueError("Stack Empty")
注意,Queue对象的qsize方法是不可靠的!!!