剑指Offer(Java版):栈的压入、弹出序列

题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。java

假设压入栈的全部数字均不相等。例如序列1,2,3,4,5是某栈的压栈序列,序列,4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不多是该压栈序列的弹出序列。.net

解决这个问题很直观的想法就是创建一个辅助栈,把输入的第一个序列中的数字依次压入该辅助栈,并按照第二个序列的顺序依次从该栈中弹出数字。指针

以弹出序列4,5,3,2,1为例分析压栈和弹出的过程。第一个但愿 被弹出的数字是4,所以4须要先压入到辅助栈里面。压入栈的顺序由压栈序列肯定了,也就是在把4压入进栈以前,数字1,2,3都须要先压入到栈里面。此时 栈里面包含4哥数字,分别是1,2,3,4,其中4位于栈顶。把4弹出栈后,剩下的三个数字是1,2,3.接下来但愿被弹出的数字是5,因为它不是栈顶的 数字,所以咱们接着在第一个序列中巴4之后的数字压入辅助栈中,直到压入了数字5.这个时候5位于栈顶,就能够被弹出来了。接下来但愿被弹出的三个数字依 次是3,2,1.因为每次操做前他们都位于栈顶,所以直接弹出便可。下表描述了本例中入栈和出栈的过程。get

总结上述入栈、出栈的过程,咱们可疑找到判断一个序列是否是栈的弹出 顺序的规律:若是下一个弹出的数字恰好是栈顶数字,那么直接弹出。若是下一个弹出的数字不在栈顶,咱们把压栈序列中尚未入栈的数字压入辅助栈,知道把下 一个须要弹出的数字压入栈顶为止。若是全部的数字都压入栈了仍没有找到下一个弹出的数字,那么该序列不多是一个弹出序列。class

造成清晰的思路后,咱们能够些代码了,下面是Java代码的实现。import

 

 

package cglib;List

import java.util.ArrayList;
import java.util.Stack;im

 

public class DeleteNode {
     public boolean IsPopOrder(ArrayList<Integer> pushA,ArrayList<Integer> popA) {  
            if(pushA.size()!=popA.size()){  
                return false;  
            }
            
            Stack<Integer> stack = new Stack<Integer>(); //建立一个辅助的堆栈
            int j=0; //定义一个指向弹出序列第一位的指针
              for(int i=0;i<pushA.size();i++){  
                  stack.push(pushA.get(i)); //对于压入序列,每一个数压入辅助栈中,每当压入一个数进行判断
                  while((!stack.empty())&&(stack.peek()==popA.get(j))){  
                      stack.pop();  
                      j++;  //栈顶元素与弹出序列指针所指的数进行比较,若相同则弹栈,同时指针后移一位,直到栈顶元素与指针所指元素不一样,则压入下一个压入序列中的数
                  }  
              }  
              if(stack.empty()){  
                  return true;  //最终若辅助栈为空说明弹出序列为压入序列的弹出顺序。
              }else{  
                  return false;  
              }  
        }  
        public static void main(String[] args){  
            ArrayList<Integer> pushA = new ArrayList<Integer>();  
            pushA.add(1);  
            pushA.add(2);  
            pushA.add(3);  
            pushA.add(4);  
            pushA.add(5);  
            ArrayList<Integer> popA = new ArrayList<Integer>();  
            popA.add(4);  
            popA.add(5);  
            popA.add(3);  
            popA.add(2);  
            popA.add(1);  
            DeleteNode s = new DeleteNode();  
            boolean res = s.IsPopOrder(pushA, popA);  
            System.out.println(res);  
        }总结

 

输出static

true

相关文章
相关标签/搜索