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