问题二 如何根据入栈序列判断可能出栈序列
如入栈的子序列是{1-2-3-4-5},那么出栈的顺序有可能是{3-2-5-4-1}么?
当然可以啦,我们这么想,首先,栈是先进后出,一般先出栈顶的元素。那么我们依次将输入序列入栈,并判断入栈以后的栈顶元素是否等于出栈序列的第一个元素,那么就将入栈的元素pop出。最后,看入栈的所有元素是否已经pop出。并且出栈的序列是否全部划过。
class Stack():
def __init__(self):
self.items=[]
def is_empty(self):
return len(self.items)==0
def pop(self):
if self.is_empty():
return None
else:
self.items.pop()
def peek(self):
if self.is_empty():
return None
else:
return self.items[len(self.items)-1]
def push(self,data):
self.items.append(data)
def isserial(push,pop):
if push==None or pop==None:
return False
pushlen=len(push)
poplen=len(pop)
if pushlen!=poplen:
return False
pushindex=0
popindex=0
s=Stack()
while pushindex<pushlen:
s.push(push[pushindex])
pushindex+=1
while (not s.is_empty()) and (s.peek()==pop[popindex]):
s.pop()
popindex+=1
return s.is_empty() and popindex==poplen#####这里是因为popindex+=1所以是popindex==poplen
if __name__=="__main__":
push="12345"
pop="32541"
isserial(push,pop)