Java详解剑指offer面试题31--栈的压入、弹出序列

Java详解剑指offer面试题31–栈的压入、弹出序列

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

题目只是给出了两个序列,并没有栈,所有我们需要自己定义一个辅助栈帮助我们模拟入栈出栈过程。

需要用到一个指针表示在出栈序列中的当前出栈元素。每次入栈一个元素,之后立刻和出栈序列中当前出栈元素对比,若相同就弹出刚压入的元素、同时当前弹出元素指针前移。之后还要继续比较,如果栈顶还和当前弹出元素相同则需要接着弹出。否则压入入栈序列中的下一个元素。

正常情况下,如果出栈顺序正确,当入栈序列中的元素都被压入后,辅助栈能按照出栈序列全部弹出。如果当元素都被压入后,辅助栈没能弹出所有元素(不为空),说明出栈顺序是错误的。

package Chap4;

import java.util.LinkedList;

public class StackPopOrder {
     

    public boolean IsPopOrder(int [] pushA,int [] popA) {
     
        if (pushA == null || popA == null || pushA.length == 0 || popA.length == 0) {
     
            return false;
        }
        // 辅助栈
        LinkedList<Integer> stackAux = new LinkedList<>();
        int popIndex = 0;
        for (int i = 0;i < pushA.length;i++) {
     
            // 按照入栈序列依次压入辅助栈中
            stackAux.push(pushA[i]);
            // 每入栈一次和出栈序列比较,如果栈顶和当前出栈元素相同,则弹出同时当前弹出元素指针前移;
            // 如果下一个栈顶元素还和当前弹出元素相同,继续弹出
            while (!stackAux.isEmpty() && stackAux.peek() == popA[popIndex]) {
     
                stackAux.pop();
                popIndex++;
            }
        }
        // 如果出栈顺序正确,模拟一次进出栈后,辅助栈应该为空。不为空说明序列不正确
        return stackAux.isEmpty();
    }
}

假如入栈顺序是[1, 2, 3, 4, 5]举个出栈顺序正确的例子[4, 5, 3, 2, 1]

操作 辅助栈 出栈
压入1 1
压入2 1, 2
压入3 1, 2, 3
压入4 1, 2 ,3 ,4
弹出4 1,2 ,3 4
压入5 1,2, 3 ,5
弹出5 1, 2, 3 5
弹出3 1,2 3
弹出2 1 2
弹出1 1

再举个错误的出栈顺序的例子[4,3,5,1,2]

操作 辅助栈 出栈
压入1 1
压入2 1, 2
压入3 1, 2, 3
压入4 1, 2 ,3 ,4
弹出4 1,2 ,3 4
弹出3 1, 2 3
压入5 1, 2, 5
弹出5 1, 2 5
弹出2 2
弹出1 1

最后只剩两个元素1, 2时,由于2在栈顶1在栈底,不能先弹出1在弹出2,所以这个出栈顺序是错误的。


本文参考文献:
[1]github.com/haiyusun/data-structures

你可能感兴趣的:(笔记)