栈的计算(入栈出栈顺序是否合法)-代码

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不合法。

注意,分隔符处可以什么也不输,直接换行,表示每一个字符都是一个单独的值。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Unconquerable p

给点吧~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值