1)了解一下栈
栈可以这么理解:
一个分层箱子,只有上面有入口。先进入的值必然会到下面。
而到了向外取值的时候,上面的,也就是后进去的反而先被取了出来,先进入的只能后出。这叫做:“先入后出”。
2)例题。
例如,入栈顺序为a,b,c,d,e,求不合法的出栈顺序:
A. a,b,c,d,e
B. e,d,c,b,a
C. a,b,c,e,d
D. e,c,d,b,a
情况1)全入,那么出栈顺序为:e,d,c,b,a(B选项),没什么可说的。
情况2)单入。一个一个入,一个一个取。比如,先入一个值a,然后不在入值,而是先把它取出来,再入b,取b,入c,取c,等等。那么,这样的出栈顺序则变成了a,b,c,d,e。(A选项)
情况3)先入一部分,取,再入,再取,等等。这部分情况太多,自己理解地去想想吧。
3)程序实现。
要想教给程序如何判断这么复杂的情况可能有些困难,但让它“穷举”则能体现出其长处。
#coding=utf-8
class ZHAN(object):
def __init__(self):
self.real=[]
def add(self,other):
self.real.append(other)
def remove(self):
return self.real.pop()
def size(self):
return len(self.real)
def clear(self):
self.real=[]
def everything_out(self):
a=self.real[::-1]
self.clear()
return a
def canout(self):
try:
return self.real[-1]
except IndexError:
return None
def islegal(lt,choose_list):
init=ZHAN()
aa=0
legal=[]
illegal=[]
for i in choose_list:
aa+=1
out=[]#8 25 14 87 51 90 6 19 20
init.clear()
for j in lt:
init.add(j)
try:
while (i[len(out)]==init.canout()):
out.append(init.remove())
except:
pass
print(out)
if len(out)==len(i):
print(f"{aa}合法。")
legal.append(aa)
else:
print(f"{aa}不合法。")
illegal.append(aa)
a=input("进入顺序:")
sp=input("分隔符")
if sp=="":
a=list(a)
else:
a=a.split(sp)
print("选项:(本行不输入内容+换行停止输入)")
b=[]
aa=0
while True:
aa+=1
z=input(f"{aa}项:")
if sp!="":
m=z.split(sp)
else:
m=list(z)
if z!="":
b.append(m)
else:
break
islegal(a,b)
先创建一个栈的实体数据类型,再进行穷举分析。
可以来看一下结果:
进入顺序:abcde
分隔符
选项:(本行不输入内容+换行停止输入)
1项:abcde
2项:edcba
3项:abced
4项:ecdba
5项:
['a', 'b', 'c', 'd', 'e']
1合法。
['e', 'd', 'c', 'b', 'a']
2合法。
['a', 'b', 'c', 'e', 'd']
3合法。
['e']
4不合法。
注意,分隔符处可以什么也不输,直接换行,表示每一个字符都是一个单独的值。