最近在学数据结构这门课,老师留了一道习题。
正整数1,2,3,4顺序入栈,要求写出乱序出栈的所有可能次序。
我这个人比较懒,就想着让计算机帮我想,于是就有了这篇文章。
思路:
最初想法是用二叉树实现,尝试了一段时间之后发现行不通,因为二叉树的遍历输出有问题,只能一次性输出所有的元素, 而不能每条支路都遍历。 后来在网上查资料看到一种非常规方法:用 1 和 0 标记入栈与出栈的次序 例如序列123 111000 就是1,2,3先后入栈,然后3,2,1出栈
于是我就尝试用数组来记录出栈入栈的所有次序。 然后再依据确定的次序 进行入栈出栈的操作
正整数1,2,3...n 依次入栈,乱序出栈,列出所有可能的出栈次序
"""
stack = [] #栈
lis = [1,2,3,4] #待操作序列
n = 4 #带操作序列元素个数
s_list = [[1]] #记录入栈出栈次序的嵌套列表 其第一步操作必然是入栈
count = 0 #记录总的出栈入栈操作次序个数
while True: #因次序个数是未知的,所以用while循环
t_list = s_list.pop() #将嵌套列表最后一个元素弹出
s_list_1 = t_list[:] #因列表的属性,为避免对列表的操作互相影响
s_list_2 = t_list[:]
if t_list.count(1) < n: ##判断 #对于s_list_1 判断其是否可继续进栈 若已进栈元素个数小于总元素个数 则继续进栈
s_list_1.append(1)
if s_list_1.count(1) == n: #若已进栈元素个数等于总元素个数
while len(s_list_1) < 2*n: #则将进出栈次序补充完整(即在数组尾补0,直至栈内所有元素弹出)
s_list_1.append(0)
lis_2 = lis[:]
queue = [] #储存出栈元素
for num in s_list_1: #打印以确定的出栈次序
if num == 1:
stack.append(lis_2.pop(0))
if num == 0:
queue.append(stack.pop())
print(queue)
count = count+1 #没打印一个,计数加1
if s_list_2.count(1) > s_list_2.count(0): #对于s_list_2 判断其是否可出栈 若已进栈元素个数大于已出栈元素个数 则继续进栈
s_list_2.append(0)
s_list.append(s_list_2)
if s_list_1.count(1) < n:
s_list.append(s_list_1)
if s_list == []: #列表为空 所有的可能次序已遍历完,结束循环
break
print(count)