偶然的想法。
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]
输出: