1.题目
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
如:输入[1,2,3,4,5],[4,3,5,1,2] 返回false
输入[1,2,3,4,5],[4,5,3,2,1] 返回true
2.思路
模拟法:
直接模拟即可。因为弹出之前的值都会先入栈,所以这里用个栈来辅助。

  1. 初始化:用指针i指向pushV的第一个位置, 指针j指向popV的第一个位置
  2. 如果pushV[i] != popV[j], 那么应该将pushV[i]放入栈中, ++i
  3. 否则,pushV[i]==popV[j], 说明这个元素是放入栈中立马弹出,所以,++i, ++j,然后应该检查popV[j]
  4. 与栈顶元素是否相等,如果相等,++j, 并且弹出栈顶元素
  5. 重复2,3, 如果i==pushV.size(), 说明入栈序列访问完,此时检查栈是否为空,如果为空,说明匹配,斗则不匹配
    import java.util.*;
    public class Solution {
    public boolean IsPopOrder(int [] pushA,int [] popA) {
     if(pushA.length==0||popA.length==0) return false;
     Stack<Integer> s=new Stack<>();//辅助中间栈
     int len=pushA.length;
     int j=0;//记录popA数组当前所指位置
     for(int i=0;i<len;i++){
         s.push(pushA[i]);//
         while(!s.isEmpty()&&s.peek()==popA[j]){//如果当前栈不为空且栈顶元素等于popA当前元素值
             s.pop();//出栈
             j++;//popA校对成功,后移一位
         }
     }
     return s.isEmpty();//如果辅助栈全部入栈再出栈成功,返回true
    }
    }