题目内容:
洗碗工小明碰上了一位强迫症老板老王,餐厅一共就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:交作业时候第四个案例没过,不知道什么原因,暂时没找出来。如果有大神发现,请留言。