import java.util.ArrayList;
import java.util.Stack;

public class Solution {
    public boolean IsPopOrder(int [] pushA,int [] popA) {
        if (pushA.length <= 0) {
            return false;
        }
        Stack<Integer> stk = new Stack<>();

        int j = 0;    // 用j指针指向popA数组中待处理的每个元素
        int k = 0;    //用k指针指向pushA数组
        /*
            大致思路:首先找到push数组中第一个等于popA[j](j从0开始)的元素(假设pushA数组中第k个数为该元素),
            因为popA[0]第一个出栈,所以要将pushA数组中前k个元素全部入栈,然后将pushA[k]出栈,接着j++,判断
            栈顶元素是否为popA[j],如果是就出栈。继续判断下一个元素,如果不是,就遍历pushA,如果pushA[k]不等于popA[j],
            那么就入栈,直到找到值为popA[j]的pushA[k]。最后,判断栈是否为空,并且确认已经遍历完成,如果为空栈,说明popA
            的序列为正常出栈序列, 否则为错误出栈序列
            
        */
        
        
        for (; k < pushA.length; k++) {
            if (pushA[k] != popA[0]) {
                stk.push(pushA[k]);
            } else {
                break;
            }
        }
        k++;
        j++;
        
        while (j < popA.length) {
            int temp;
            if (!stk.empty()) {
                temp = stk.pop();
                if (temp == popA[j]) {
                    j++;
                    continue;
                }
                stk.push(temp);
            }
            
            while (k < pushA.length) {
                if (pushA[k] != popA[j]) {
                    stk.push(pushA[k]);
                } else {
                    k++;
                    break;
                }
                k++;
            }
            j++;
        }
        if (k >= pushA.length && stk.empty()) {
            return true;
        } else {
            return false;
        }
        
    }
}