题解 | #栈的压入、弹出序列#
栈的压入、弹出序列
http://www.nowcoder.com/practice/d77d11405cc7470d82554cb392585106
栈的压入、弹出的概念请百度
例如【3,2,1,4,5】 ,若待判断的弹出序列为【4,5,1,2,3】,则实际操作为:
第一步:先依次压入3,2,1,得到【3,2,1】,随后压入4,并弹出4,完成了4的压入和弹出;
第二步:我们完成了4的弹出,依据弹出序列,接下来需要弹出5,此时可行的情况是,弹出已压入的最后一位3或者再压入5弹出5,显然,待弹出的数字5与剩余待压入的5一致,因此,先压入5,再弹出5;
第三步:由于此时的压入序列为【3,2,1】,则依次从尾部弹出1,2,3即可;
经过上述示例的说明(这个游戏有点像window系统自带的纸牌游戏),可弹出的数字只能是已压入序列的最后一位或者还还未压入的数字。
因此,我们只需要模拟这个过程即可:
第一步,采用指针指向弹出序列的第一位,记录该数字,然后从压入序列的0位开始寻找;
第二步,若找到数字,则完成本次弹出,删除压入序列中的该数字,并令压入序列的指针左移一位(指向已压入的最后一个数字,类似上述案例中的4被删除后,指向3);若找不到数字,则直接return False即可;
第三步,完成了弹出序列首位的弹出任务后,弹出序列的指针右移一位,记录该数字,重复第二步;
第四步,不断进行第三步,直至弹出序列遍历完成,则直接return True即可
代码如下:
# -*- coding:utf-8 -*-
class Solution:
def IsPopOrder(self, pushV, popV):
pointer_pushV = 0
pointer_popv = 0
while pointer_popv < len(popV): # 指针不得越过栈限
if popV[pointer_popv] in pushV[pointer_pushV:]:
pointer_pushV = pushV.index(popV[pointer_popv])
del pushV[pointer_pushV]
pointer_pushV = max(0,pointer_pushV - 1)
pointer_popv += 1
else:
return False
return True

