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

本文介绍了一种使用数组记录出入栈次序的方法,通过编程实现正整数1到4的乱序出栈所有可能的次序。利用1和0标记入栈与出栈动作,进而生成所有合法的出入栈序列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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




用C语言解决题目 一列挂有 n 节车厢(编号从 1 到 n)的货运列车途径 n 个车站,计划在行车途中将各节车厢停放在不同的车站。假设 n 个车站的编号从 1 到 n,货运列车按照从第 n 站到第 1 站的顺序经过这些车站,且将与车站编号相同的车厢卸下。 货运列车的各节车厢以随机顺序轨,为方便列车在各个车站卸掉相应的车厢,须重排这些车厢,使得各车厢从前往后依次编号为 1 到 n,这样在每个车站只需卸掉当前最后一节车厢即可。 车厢重排可通过转轨站完成。一个转轨站包含一个轨,一个出轨和 k 个位于轨和出轨之间的缓冲轨。缓冲轨用于存储尚未确定输出次序的车厢。重排车厢的规则包含如下三条: 一个车厢从轨移至出轨或缓冲轨; 一个车厢只有在其编号恰是下一个待输出编号时,可移到出轨; 一个车厢移到某个缓冲轨,仅当其编号大于该缓冲轨中队尾车厢的编号,若多个缓冲轨满足这一条件,则选择队尾车厢编号最大的,否则选择一个空缓冲轨,若无空缓冲轨则无法重排。 请你编写程序实现这个重排算法。 输格式: 输在第一行中给出两个正整数 n 和 k,均不超过 100,分别为车厢数量和缓冲轨数量。第二行按轨顺序给出 n 节车厢的编号,数字间以空格分隔。 输出格式: 按照车厢进出轨的顺序,输出每节车厢在轨时的位序(从 0 开始),每个数字占一行。若无法重排,则在一行中输出信息 错误:任务不可能完成。。 输样例 1: 9 3 5 8 1 7 4 2 9 6 3 输出样例 1: 2 5 8 4 0 7 3 1 6 输样例 2: 9 2 5 8 1 7 4 2 9 6 3 输出样例 2: 错误:任务不可能完成。
最新发布
04-28
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值