题目描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列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 }