题目描述:
翻转栈中的所有元素,例如输入栈{1,2,3,4,5}, 其中,1处在栈顶,翻转之后的栈为{5,4,3,2,1}其中,5在栈顶。
方法一:最容易想到的方法就申请额外的一个队列,先把栈中的元素依次出栈放到队列里,然后把队列里的元素按照出队列顺序入栈,然这样就可以实现栈的翻转。
方法二:递归法
递归程序有两个关键的因素需要注意: 递归定义和递归的终止条件。递归定义:将当前栈的最底元素移动到栈顶,其他元素顺次下移一位,然后对不包含栈顶元素的子栈进行同样的操作。终止条件:递归下去直到栈为空。
class Stack:
def __init__(self):
self.items = []
def push(self, x):
self.items.append(x)
def isempty(self):
return len(self.items) == 0
def peek(self):
if not self.isempty():
return self.items[len(self.items) -1]
else:
return None
def pop(self):
if len(self.items) > 0:
return self.items.pop()
else:
print("栈空")
return None
def moveBottomTotop(s):
if s.isempty():
return
top1 = s.peek()
s.pop() # 弹出栈顶元素
if not s.isempty():
moveBottomTotop(s)
top2 = s.peek()
s.pop()
s.push(top1)
s.push(top2)
else:
s.push(top1)
def reverse_stack(s):
if s.isempty():
return
# 栈底元素移动到栈顶
moveBottomTotop(s)
top = s.peek()
s.pop()
reverse_stack(s) # 递归处理子栈
s.push(top)
if __name__ == "__main__":
s = Stack()
s.push(5)
s.push(4)
s.push(3)
s.push(2)
s.push(1)
reverse_stack(s) # 反转栈中元素
print("翻转后出栈顺序为:")
while not s.isempty():
print(s.peek(), end=" ")
s.pop()