第21题——栈的压入和弹出序列是否匹配

453 阅读2分钟

题目:

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)

思路:

利用一个辅助栈stack,将压入序列的数字依次压入栈stack,并且判断此时栈顶的元素是否与弹出序列的首元素相等,若相等,则stack弹出一个元素,并弹出序列首元素后移一位,若不相等,则再将压入序列的数字压入辅助栈stack。最终判断栈stack是否为空,若为空返回true,否则返回false。

举例:

入栈1,2,3,4,5
出栈4,5,3,2,1
首先1入辅助栈,此时栈顶1≠4,继续入栈2
此时栈顶2≠4,继续入栈3
此时栈顶3≠4,继续入栈4
此时栈顶4=4,出栈4,弹出序列向后一位,此时为5,,辅助栈里面是1,2,3
此时栈顶3≠5,继续入栈5
此时栈顶5=5,出栈5,弹出序列向后一位,此时为3,,辅助栈里面是1,2,3
….
依次执行,最后辅助栈为空。如果不为空说明弹出序列不是该栈的弹出顺序。

Java

package nowcoder;

import java.util.Stack;

public class S21_IsPopOrder {
    public boolean isPopOrder(int[] pushA, int[] popA){
        if (pushA.length==0 || popA.length == 0)
            return false;
        Stack<Integer> stack = new Stack<Integer>();
        int j = 0;
        for (int i=0;i<pushA.length;i++) {
            stack.push(pushA[i]);
            while (!stack.isEmpty() && stack.peek() == popA[j]){
                stack.pop();
                j++;
            }
        }
        return stack.isEmpty();
    }
    public static void main(String[] args){
        S21_IsPopOrder s21 = new S21_IsPopOrder();
        int[] pushA = {1, 2, 3, 4, 5};
        int[] popA = {4, 3, 5, 1, 2};
        boolean result = s21.isPopOrder(pushA, popA);
        System.out.println(result);
    }
}

Python

class IsPopOrder:
    def isPopOrder(self, pushA, popA):
        stack = []
        j = 0
        for i in range(len(pushA)):
            stack.append(pushA[i])
            while stack and stack[-1] == popA[j]:
                stack.pop()
                j += 1
        if len(stack) == 0:
            return True
        else: return False

if __name__ == '__main__':
    test = IsPopOrder()
    pushA = [1, 2, 3, 4, 5]
    popA = [4, 5, 3, 2, 1]
    print(test.isPopOrder(pushA, popA))