面试题三十一:栈的压入、弹出序列
输入两个序列,第一个序列为栈的压入顺序,第二个序列为栈的弹出顺序,设问第二个序列是否是第一个序列的弹出序列。
方法:定义一个辅助栈,和两个指针分别指向两个序列的开头,压入序列进栈,栈顶元素与弹出序列指针指向的比较,不一致,继续进栈比较,一致,弹出栈顶元素。
规律:如果下一个弹出的数字刚好是栈顶数字,那么直接弹出;
如果下一个弹出的数字不在栈顶,那么就把压栈序列的元素压进,直到栈顶为下一个弹出数字为止;
如果所有序列都压入还没有找到下一个弹出的数字,则第二个序列是否是第一个序列的弹出序列
注意:每个栈的出栈顺序不止一个,不能一位两个数组一个从头一个从尾遍历比较就行
public static boolean IsPopOrder( int [] Ppush , int [] Ppop){ if( Ppush==null||Ppop==null||Ppush.length<=0 || Ppop.length<=0) return false int p1=0 ,p2=0; Stack<Integer> stack=<u>new Stack() ; while(p1<Ppush.length && p2<Ppop.length){ while((stack.empty()||stack.peek()!=Ppop[p2])&& p1<Ppush.length ){ stack.push( Ppush[p1] ) ; p1++; } while(!stack.empty()&&stack.peek()==Ppop[p2] && p2<Ppop.length ) { stack.pop(); p2++; } } if(!stack.empty()|| p1<Ppush.length || p2<Ppop.length) return false; return true; }
浪波激泥