今天主要写一些关于栈的常见算法问题
- 如何翻转栈的所有元素
- 如何根据入栈序列判断可能出栈的序列
- 如何用O(1)的时间复杂度求栈中最小的元素
问题一 如何翻转栈的所有元素
例如输入序列是{1,2,3,4,5},1是栈顶元素。翻转以后的栈为{5,4,3,2,1},5 为栈顶元素。
NOTE:这里我们用到递归的思想,把栈底元素与放到栈顶的位置
如 {51234}-{54123}-{54312}-(54321)
#先定义一个栈
class Stack():
def __init__(self):
self.items=[]#这里采用数组定义栈,前面也讲了链表的方法
def is_empty(self):
return len(self.items)==0
def pop(self):#弹出栈顶元素
if self.is_empty():
return None
else:
return self.items.pop()
def peek(self):#查看栈顶元素
if self.is_empty():
return None
else:
return self.items[len(self.items)-1]
def push(self,data):
self.items.append(data)
def movebottomtotop(s):
if s.is_empty():
return
else:
top1=s.peek()
s.pop()
if not s.is_empty():
movebottomtotop(s)#递归调用
top2=s.peek()
s.pop()
s.push(pop1)
s.pop(push2)
else:
s.push(top1)
def reverse(s):
if s.is_empty():
return None
else:
movebottomtotop(s)
top=s.peek()
s.pop()
reverse(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(s)
while not s.is_empty():
print(s.peek())
s.pop()