面试题三十一:栈的压入、弹出序列

 

输入两个序列,第一个序列为栈的压入顺序,第二个序列为栈的弹出顺序,设问第二个序列是否是第一个序列的弹出序列。
方法:定义一个辅助栈,和两个指针分别指向两个序列的开头,压入序列进栈,栈顶元素与弹出序列指针指向的比较,不一致,继续进栈比较,一致,弹出栈顶元素。

规律:如果下一个弹出的数字刚好是栈顶数字,那么直接弹出;
如果下一个弹出的数字不在栈顶,那么就把压栈序列的元素压进,直到栈顶为下一个弹出数字为止;
如果所有序列都压入还没有找到下一个弹出的数字,则第二个序列是否是第一个序列的弹出序列

注意:每个栈的出栈顺序不止一个,不能一位两个数组一个从头一个从尾遍历比较就行

  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;        
               }

 

posted @ 2020-03-29 14:57  浪波激泥  阅读(236)  评论(0编辑  收藏  举报