判断栈的出栈序列是否正确

Posted dream-flying

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了判断栈的出栈序列是否正确相关的知识,希望对你有一定的参考价值。

问题

  输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)

 

分析

  (1)假设在出栈序列中当前元素出栈,那么位于它压栈序列中的后续元素不能出现这种情况(当前元素出栈,未出栈已出栈)——

  (2)实现:使用一个记录数组,记录压栈序列中元素是否出栈。

  

code

   

//当前元素出栈,该元素之前为出栈的元素,严格按照栈的规则出栈(先进后出)。
    //所有数字均不相等
    public boolean IsPopOrder(int [] pushA,int [] popA) {
        Map<Integer,Integer> map = new HashMap<Integer,Integer>(); //记录每个数字在pushA数组中的位置
        for(int i=0;i<pushA.length;i++) {
            map.put(pushA[i], i);
        }
        boolean dp[] = new boolean[pushA.length];  //出栈记录数组
        //当前出栈元素,往后搜索,不允许出现》先false,后true。
        for(int i=0;i<popA.length;i++) {
            Integer key = Integer.valueOf(popA[i]);
            if(!map.containsKey(key)) {    //元素不等,直接false、
                return false;
            }
            int index = map.get(key);
            boolean flag=false;        //找到false的标志位
            for(int j=index+1;j<pushA.length;j++) {
                if(!dp[j]) {
                    flag=true;
                }
                if(flag && dp[j]) {
                    return false;
                }
            }
            dp[index] = true;
        }
        return true;
          
    }

 

以上是关于判断栈的出栈序列是否正确的主要内容,如果未能解决你的问题,请参考以下文章

判断出栈序列是否可能是某个入栈序列的出栈序列,C++

给定一个序列,判断该序列是否是对应输入序列的出栈序列问题

剑指offer判断出栈序列是否合法

栈-出栈序列正确性分析

判断是否是合法的出栈序列

给定入栈序列,求所有可能的出栈序列。