正整数1,2....n依次入栈,输出出栈次序!(不仅输出个数)

最近在学数据结构这门课,老师留了一道习题。

正整数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)




  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值