[刷题]栈的压入 弹出序列

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/programmingfool5/article/details/82760404

题目:

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。

例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。

思路:

  • 构建一个辅助栈 stack 按照push顺序依次来对比pop序列的元素.
  • 若栈不为空且栈顶元素等于pop序列的元素, 那么进行下一轮迭代,比对下一个pop序列的元素 .
  • 当前对比元素不相等时: 将push序列的元素压入stack .
  • 当元素相等时,(等于压入stack的push元素再弹出,没有影响), 比对下一个pop序列的元素 .

整体是对三个栈来操作 :
对于pop序列来说, 我们只需要对于进行index的从前往后遍历和对比. 同时对比stack 和 push序列.

对于push序列来说, 我们需要对其不断的压入辅助栈stack,同时元素是进行的pop( ), 当push为空了, 是判断循环结束的条件. 元素都已经压入辅助栈了,但是辅助栈的栈顶元素跟pop序列的栈顶元素不一致, 直接判断为False.

对于辅助栈来说, 一是需要栈顶跟pop元素比较; 二是需要不断的将push的元素压入, 压入的条件是push和pop序列的对比

class Solution:
    def IsPopOrder(self,pushV, popV):
    
        length = len(pushV)
        if length ==1:
            return pushV == popV
        stack = []
        if pushV and popV and length > 0:
            x = 0
            while x < len(popV):  
            # 弹出的元素
                if stack and stack[-1] == popV[x]:
                  # 检查栈顶元素是否相等
                    stack.pop(-1)
                    x += 1
                    continue  # 相等就继续下一个弹出元素
                while pushV and pushV[0] != popV[x]:  
                    # 如果弹出元素与压入序列中的头元素不同,
                    # 那么将头元素压入,直到找到第一个相等的元素
                    stack.append(pushV.pop(0))
                if pushV and  pushV[0] == popV[x]:
                    pushV.pop(0)
                    x += 1
                if not pushV and stack[-1]!=popV[x] :
                #如果push序列空了, 当前的当前pop序列的元素与辅助栈的顶元素不相等
                #直接返回False
                    return False
            return not stack



猜你喜欢

转载自blog.csdn.net/programmingfool5/article/details/82760404