剑指offer系列19--栈的压入、弹出序列

题目描述

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

 1 package com.exe4.offer;
 2 
 3 import java.util.ArrayList;
 4 
 5 /**
 6  * 19【题目】输入两个整数序列,第一个序列表示栈的压入顺序,
 7  *             请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。
 8  *             例如序列1,2,3,4,5是某栈的压入顺序
 9  *             序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。
10  *    【思路】
11  * @author WGS
12  *
13  */
14 public class StackPushPopSequence {
15 
16     public boolean isPopOrder(int[] pushA,int[] popA){
17         
18         
19         boolean flag=false;
20         ArrayList<Integer> assistList=new ArrayList<Integer>();
21     
22         
23         if(pushA.length>0 && popA.length>0 && pushA.length==popA.length){
24             
25             //当前 popA中的数
26             int pop=0;
27             //下一个弹出的元素
28             int nextPop=0;
29             //pushA当前元素
30             int push=0;
31             //下一个压入的元素
32             int nextPush=0;
33             int len=pushA.length;
34             int index=-1;
35             while(nextPop-pop<len){//要求的顺序
36                 //判断 辅助集合中当前元素 与 要求的排列的顺序的栈顶值 不一样时,就加入该栈顶值在pushA中以前的值
37                 while(assistList.size()==0 || assistList.get(index)!=popA[nextPop]){
38                     if(nextPush-push==len) break;
39                     assistList.add(pushA[nextPush]);
40                     index++;
41                     nextPush++;
42                 }
43                 //再确认下
44                 if(assistList.get(index)!=popA[nextPop]) break;
45                 //当该元素及之前元素加入完了之后,就弹出去,指向popA中下个顺序的元素
46                 assistList.remove(index--);
47                 nextPop++;
48             }
49             if(assistList.size()==0 && nextPop-pop==len){
50                 flag=true;
51             }
52             
53         }
54         return flag;
55         
56     }
57     public static void main(String[] args) {
58         // TODO Auto-generated method stub
59          int[] pushA = new int[]{1,2,3,4,5};
60           int[] popA = new int[]{4,5,3,2,1};
61           System.out.println(new StackPushPopSequence().isPopOrder(pushA, popA));
62             
63     }
64 
65 }
原文地址:https://www.cnblogs.com/noaman/p/5444186.html