栈三:栈的压入、弹出序列

/**
 * 题目:栈的压入、弹出序列
 * 描述:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。
 *   例如序列1,2,3,4,5是某 栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。
 *    (注意:这两个序列的长度 是相等的)
 *  注:
 *  1、pushA popA为空时直接返回false
 *  2、创建一个新的stack,将pushA压入stack,每压一个,做一次判断:是否与popA[j]相等,如果相等,将stack出栈,并j++
 *  3、最后如果stack为空,则返回true,反之返回false
 * 方案:  
 *   思路:先进行压栈,压入后与弹出序列递增进行比较,相同弹出,不相同保留,最后判断栈内是否还要元素。(可以在入栈的时候就进行判断,看是否和弹出序列的第一个相同)
 *   如果是该栈的弹出顺序,则下面的for循环中,先进行入栈操作,每次入栈都与弹出序列的第一个数字不相同,直到压入最后一个栈,与之相同,
 *    然后在while里面一次比较,如果有一个不相同,则保留栈内数字,最后栈内还有元素表示不是该栈的弹出序列,
 * */

public class Three {

    public static boolean one(int[] push ,int pop[]) {
        
        if(push.length==0 || pop.length ==0) {
            return false;
        }
        Stack<Integer> stack = new Stack();
        
        for(int i =0,j=0;i<push.length;i++) {
            stack.push(push[i]);
            while(j<pop.length &&stack.peek() == pop[j] ) {  // 每次入栈判断是否和出栈第一个相同,如果相同了,直接出栈,比较出栈序列的第二个和入栈数字,会导致stack一直存放入栈的数据,stack不为空,表示不是该栈的
                stack.pop();
                j++;
            }
        }
        return stack.isEmpty()?true:false;
    }
}

 

posted @ 2018-11-16 15:07  弄潮儿儿  阅读(201)  评论(0编辑  收藏  举报