输入入栈序列,所有出栈可能性(用BFS)

偶然的想法。
in_list为要输入的入栈队列,out_list为出栈队列的所有可能性列表,want_list为想要的输出序列,当有want_list的时候返回值为bool值。
感觉还得优化优化,改进一下。先记录。简单的来说分两步,感觉可能有大神用的更好吧。
最近接触学习了一下BFS和DFS,然后想到了这个入栈和出栈。简单运用了一下BFS广度优先搜索。

先是我的解题思路,这个是初步方案,就叫初稿一

def stack(in_list):
	#首先简单用BFS找出所有出入栈的可能性
    t=len(in_list)
    all_list=[[[[-1],[t-1,t]]]]#粗人一个就简单用-1来表示入栈,1来表示出栈。t-1表示入栈次数,t表示出栈次数
    f=True
    while f:
        all_list.append([])
        f = False
        for loc in all_list[0]:
            if loc[1][0]+loc[1][1]==0:
                all_list[1].append(loc[0])#当入栈和出栈次数都为0的时候返回出入栈list。
                continue
            if loc[1][0]>=1:
                all_list[1].append([loc[0]+[-1],[loc[1][0]-1,loc[1][1]]])
            if loc[1][1]>=1 and sum(loc[0]+[1])<=0:#确保有元素可以出栈,直接一个sum简单直接。
                all_list[1].append([loc[0]+[1],[loc[1][0],loc[1][1]-1]])
            f=True
        del all_list[0]#保留一个最终list包含所有可能性就好啦~


    out_list=[]#搞一个list最终存放所有出栈序列。
    for loc in all_list[0]:#这里就简单了,直接跟着所有可能性去操作一波顺序就okkk了。
        t=0
        tmp1_list=[]#没想太多,直接搞两个临时list变量来转换一下。最后给结果到out_list
        tmp2_list=[]
        for i in loc:
            if i==-1:
                tmp1_list.append(in_list[t]).
                t += 1
            else:
                tmp2_list.append(tmp1_list.pop())
        out_list.append(tmp2_list)
    return out_list

后面想着总觉的用的变量有点多,我能不能改一下?缩短一些

那就初稿二吧
整体的思路没怎么变,就是把逻辑混合在一起,减少没用的部分

def stack(in_list):
    t=len(in_list)
    all_list=[[[[[in_list[0]],[]],[t-1,t]]]]
    f=True
    while f:
        all_list.append([])
        f = False
        for loc in all_list[0]:
            if loc[1][0]+loc[1][1]==0:
                all_list[1].append(loc[0][1])
                continue
            if loc[1][0]>=1:
                all_list[1].append([[loc[0][0]+[in_list[t-loc[1][0]]],loc[0][1]],[loc[1][0]-1,loc[1][1]]])
            if loc[1][1]>=1 and len(loc[0][0])>0:
                all_list[1].append([[loc[0][0][:-1],loc[0][1]+[loc[0][0][-1]]],[loc[1][0],loc[1][1]-1]])
            f=True
        del all_list[0]
    return all_list[0]

感觉可以加个搜索指定顺序的小功能
就先这样吧,暂定终稿

def stack(in_list,want_list=[]):#加一个期待的输出顺序
    t=len(in_list)
    if want_list and sorted(in_list) != sorted(want_list):#总的不一样的输入就直接回去不搞了
        return 'Ensure your input.'
    all_list=[[[[[in_list[0]],[]],[t-1,t]]]]
    f=True
    while f:
        all_list.append([])
        f = False
        for loc in all_list[0]:
            if loc[1][0]+loc[1][1]==0:
                all_list[1].append(loc[0][1])
                continue
            if loc[1][0]>=1:
                all_list[1].append([[loc[0][0]+[in_list[t-loc[1][0]]],loc[0][1]],[loc[1][0]-1,loc[1][1]]])
            if loc[1][1]>=1 and len(loc[0][0])>0:
                if want_list:
                    if loc[0][1]+[loc[0][0][-1]] != want_list[:t+1-loc[1][1]]:#出栈对不上号的直接pass
                        f=True
                        continue
                all_list[1].append([[loc[0][0][:-1],loc[0][1]+[loc[0][0][-1]]],[loc[1][0],loc[1][1]-1]])
            f=True
        del all_list[0]
    if want_list:#看看有没有满足条件的序列,返回bool值
        return [want_list]==all_list[0]
    return all_list[0]

输入:in_list=[1,2,3,4]

输出:
出栈序列

输入:in_list=[1,2,3,4,5], want_list = [3,2,5,4,1]

输出:
可能性存在

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值