Python练习:强迫症老板和他的洗碗工

题目内容:
洗碗工小明碰上了一位强迫症老板老王,餐厅一共就10只盘子,老板给仔细编上了0~9等10个号码,并要求小明按照从0到9的编号来洗盘子,当然,每洗好一只盘子,就必须得整齐叠放起来。
小明洗盘子期间,经常就有顾客来取盘子,当然每位顾客只能从盘子堆最上面取1只盘子离开。
老王在收银台仔细地记录了顾客依次取到盘子的编号,比如“1043257689”,这样他就能判断小明是不是遵照命令按照0123456789的次序来洗盘子了。
写一个程序,准确判断小明是否按照顺序去洗盘子了。
代码如下:

class stackDT:
    '''构建栈的数据类型'''
    def __init__(self):
        self.items = []
    def isempty(self):
        return self.items == []
    def push(self, item):
        self.items.append(item)    
    def pop(self):
        return self.items.pop()  
    def peek(self):
        return self.items[-1]
    def size(self):
        return len(self.items)
def pushstack(roomstr1, roomstr2):
    '''把栈1数据依次压入栈2'''
    while not roomstr1.isempty():
        a = roomstr1.pop()
        roomstr2.push(a)
    return roomstr2

def change(roomstr1, roomstr2):
    '''把栈2平移到栈1下面'''
    roomstr3 = stackDT()
    roomstr3 = pushstack(roomstr1, roomstr3)
    roomstr1 = pushstack(roomstr3, roomstr2)
    return roomstr1

def main():
    checkstr = list(input())
    roomstr1 = stackDT()
    roomstr2 = stackDT()
    roomstr1.push(eval(checkstr[0]))    #直接把第一个数压入第一个栈顶
    for i in checkstr[1:]:
        j = eval(i)
        if roomstr2.isempty():          #如果第二个栈为空,且第一个栈顶数字比外面数字大,则压入第一个栈,负责压入第二个栈
            if roomstr1.peek() > j:
                roomstr1.push(j)
            else:
                roomstr2.push(j)
        else:                           #如果第二个栈不为空
            if roomstr2.peek() < j:     #如果外面数字比栈顶数字大,则把栈2放到栈1底部,清空栈2
                roomstr1 = change(roomstr1,roomstr2)
                roomstr2 = stackDT()
            roomstr2.push(j)            #把数字压入栈2
        
    if not roomstr2.isempty():          #处理结束后,若栈2不为空,则把栈2放到栈1下面
        roomstr1 = change(roomstr1,roomstr2)
    if roomstr1.items == [9,8,7,6,5,4,3,2,1,0]:
        print('Yes')
    else:
        print('No')

main()

题目来自中国大学MOOC中北京大学陈斌副教授的MOOC:《数据结构与算法Python版》
ps:交作业时候第四个案例没过,不知道什么原因,暂时没找出来。如果有大神发现,请留言。

发布了46 篇原创文章 · 获赞 1 · 访问量 1562

猜你喜欢

转载自blog.csdn.net/AntInSnow/article/details/104883103