#!/usr/bin/env python
# encoding: utf-8
'''
Python程序员面试算法宝典---解题总结: 第二章 栈、队列与哈希 2.6 如何用两个栈模拟队列操作
分析:
队列的特点就是先进先出。那其实两个栈就需要模拟出先进先出的特点。
本质就是让最先进入的元素在栈顶即可。
模拟队列的push操作:
如果两个栈s1,s2都为空,则将当前待压入元素压入栈s1中;
弹出元素的时候:
交换两个栈元素,弹出栈顶元素,继续交换两个栈元素来恢复顺序
举例如下:
加入入栈序列为: 5,3,4,2,1
压入5后
s1 s2
5
压入3后
s1 s2
3
5
压入4后
s1 s2
4
3
5
弹出5操作,此时先处理后,变为
s1 s2
5
3
4
然后弹出元素5后变为
s1 s2
3
4
压入2后,先处理变为
s1 s2
4
3
真正压入2后,变为
s1 s2
2
4
3
关键:
1 书上解法
栈A入队,栈B用于出队,
如果B为空,则将A中元素压入B中,最后弹出B的top元素;
否则直接弹出B中的top元素
参考:
Python程序员面试算法宝典
'''
class Stack(object):
def __init__(self):
self.data = list()
def empty(self):
result = False if self.data else True
return result
def push(self, data):
self.data.append(data)
def pop(self):
if not self.empty():
self.data.pop()
else:
print "stack is empty, it can not pop"
def top(self):
if not self.empty():
data = self.data[-1]
return data
else:
print "stack is empty, it can not get top"
class SimutatedQueue2(object):
def __init__(self):
self.stack1 = Stack()
self.stack2 = Stack()
def swapStack(self, stack1, stack2):
fullStack = stack1 if not stack1.empty() else stack2
emptyStack = stack2 if not stack1.empty() else stack1
while not fullStack.empty():
data = fullStack.top()
fullStack.pop()
emptyStack.push(data)
return emptyStack
def push(self, data):
if self.stack1.empty() and self.stack2.empty():
self.stack1.push(data)
else:
if not self.stack1.empty():
self.stack1.push(data)
else:
self.stack2.push(data)
def pop(self):
resultStack = self.swapStack(self.stack1, self.stack2)
if not resultStack.empty():
result = resultStack.top()
resultStack.pop()
else:
result = None
#将栈还原为原来的顺序
self.swapStack(self.stack1, self.stack2)
return result
def empty(self):
result = True if self.stack1.empty() and self.stack2.empty() else False
return result
class SimulatedQueue(object):
def __init__(self):
self.stack1 = Stack()
self.stack2 = Stack()
def push(self, data):
self.stack1.push(data)
def pop(self):
if self.stack2.empty():
while not self.stack1.empty():
value = self.stack1.top()
if value is not None:
self.stack2.push(value)
self.stack1.pop()
if not self.stack2.empty():
front = self.stack2.top()
self.stack2.pop()
return front
else:
return None
def empty(self):
result = True if self.stack2.empty() and self.stack1.empty() else False
return result
def process():
queue = SimulatedQueue()
data = [5, 4, 3, 2, 1]
for value in data:
queue.push(value)
while not queue.empty():
value = queue.pop()
print value
data = [5, 4, 3]
print "###"
for value in data:
queue.push(value)
value = queue.pop()
print value
data = [2, 1]
for value in data:
queue.push(value)
while not queue.empty():
value = queue.pop()
print value
if __name__ == "__main__":
process()