题目描述:翻转栈的所有元素,例如输入栈{1,2,3,4,5},其中,1处在栈顶,翻转之后的栈为{5,4,3,2,1},其中,5处在栈顶:
看到这题,我第一个想到的方法便是申请一个额外的队列,先把栈中的元素依次出栈放到队列里,然后把队列里的元素队列的顺序入栈,来实现翻转,但是空间复杂度较高。因此选用了复杂度较低的递归的方法。
思路:先将栈底元素移到栈顶,然后递归调用出栈顶元素的子栈。(把不包含该栈顶元素的子栈的栈底的元素移动到子栈的栈顶,然后把栈顶的元素与子栈栈顶的元素进行交换。)
class Stack:
# 实现栈的功能
def __init__(self):
self.items = []
# 判断栈是否为空
def empty(self):
return self.items == None
# 返回栈的大小
def size(self):
return len(self.items)
# 返回栈顶元素
def peek(self):
if not self.empty():
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 push(self, items):
self.items.append(items)
def moveBottomToTop(s):
"""把栈底元素移动到栈顶"""
if s.empty(): # 判断是否为空 s:栈的引用
return
top1 = s.peek() # 返会栈顶元素
s.pop() # 弹栈
if not s.empty():
# 递归处理不包含栈的子栈
moveBottomToTop(s)
top2 = s.peek
# 交换栈顶元素与子栈栈顶元素
s.push(top1)
s.push(top2)
else:
s.push(top1)
def reverse_stack(s):
if s.empty():
return
# 把栈顶元素移到栈顶
moveBottomToTop(s)
top = s.peek()
s.pop()
# 递归处理子栈
reverse_stack(s)
s.push(top)