栈中常见的算法题---翻转栈的所有元素(1)

今天主要写一些关于的常见算法问题

  1. 如何翻转栈的所有元素
  2. 如何根据入栈序列判断可能出栈的序列
  3. 如何用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()

猜你喜欢

转载自blog.csdn.net/qq_43440040/article/details/107930478