package main

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * 
 * @param pushV int整型一维数组 
 * @param popV int整型一维数组 
 * @return bool布尔型
*/

//时间复杂度:O(N)、空间复杂度:O(N)
func IsPopOrder(pushed []int, popped []int) bool {
    //定义一个辅助栈,用于模拟栈的压入和弹出操作。
    stack := []int{}
    index := 0
    //遍历第一个序列中的每一个元素,依次将其压入辅助栈中
	for i := 0; i < len(pushed); i++ {
		stack = append(stack, pushed[i])
        //防止数组越界
        if index >= len(popped) {
            break
        }
        //每入栈一个元素,就判断辅助栈的栈顶元素是否等于第二个序列当前位置的元素
        //如果是,就将辅助栈的栈顶元素弹出,并将第二个序列的指针后移一位。
		for len(stack) > 0 && stack[len(stack)-1] == popped[index] {
			stack = stack[:len(stack)-1]
            index++
		}
	}
    //遍历完第一个序列后,如果辅助栈为空,则说明第二个序列可以是该栈的弹出序列,否则说明不是
	return len(stack) == 0
}