强迫症老板和他的洗碗工

故事呢,比较简单。有个餐馆老板,给他的十个碗编号为0-9。他有强迫症,要求他的洗碗工洗碗叠起来的时候,必须小号在下,大号在上的原则叠放。当客人拿碗的时候,老板就记下编号。这样,老板就可以通过编号判断洗碗工是不是按照要求来洗碗。比如老板记下4321056789,这个编号表明工人是按照要求来写的。但是老板记下4231089765的时候,老板就知道工人没有按照要求来写。

我用python这个语言来写。根据老板记下的编号来判断洗碗工是否按照要求来叠放碗。

这个题目从开始看到至我解决,花了两天吧。似乎是昨天上午看到(最近记性也不好了,具体什么时候也记不清了),今天下午两点半解决。解决的时候,我也并不是很清楚。现在写这个文章就是为了能想的更透彻一点。

先贴上我的代码,再按照代码来分析。

def pan(por):
    s=[]
    ma=0
    for i in por:
        num=int(i)
        if s==[]:
            s.extend(list(range(ma,num)))
            ma=num+1
        else:
            if num==s[-1]:
                s.pop()
            elif nums[-1]:
                s.extend(list(range(ma,num)))
                ma=num+1
    if s==[]:
        return True


por = input()
if pan(por):
    print('Yes')
else:
    print('No')

首先,整体结构当然是输入老板的编号记录,以字符串形式,然后用函数pan判断。如果洗碗工按照老板要求则返回真True,打印Yes。如果没有按照要求,则是选择结构的else分支,打印No。

下面,就来说说这个判断函数pan的结构。我的想法是当顾客拿到一个盘子后,就可以先判断盘子的叠放情况。初始化一个栈结构,因为盘子叠放明显是一个栈结构问题。这个栈是去除这个盘子编号的,代表已经被拿走了。然后下一个编号,如果这个编号等于栈顶,那说明正好是拿了刚才的下一个碗。如果小于栈顶,那肯定不行,因为跳过了,这时候直接返回False,不用再判断剩下的碗编号了。如果大于栈顶。说明这时候洗碗工又洗了几个碗放上去了。这时候需要再入栈操作。这时候需要注意标记好之前栈的最大编号。以免重复入栈碗的编号。

最后,如果碗是正确叠放的,那栈肯定为空。那么就返回真True。

目前呢,就想到这么一些。栈嘛,先进后出,后进先出。想一万遍。

你可能感兴趣的:(强迫症老板和他的洗碗工)