问题描述:给定两个序列,判断是否为对应合法的入栈出栈序列?
* 若序列元素没有重复
我想到大概三种方式,三者的前置操作均为先将元素与序列对应起来,java中放入map即可,map.put(元素 , 入栈序列) 后续判断序列是否合理即可
假设给定入栈元素: 1,3,4,7,2,8
对应序列: 1,2,3,4,5,6
那么出栈元素的组合可以是: 1,3,4,7,2,8; ,1,4,2,7,8,3; 4,3,2,8,7,1 ...
出栈元素对应的序列组合分别是:1,2,3,4,5,6; 1,3,5,4,6,2; 3,2,5,6,4,1 ...
通过分析入栈和出栈的操作,不难发现出栈的序列可以跳跃增大,却必须依次有序减小(不一定连续)。因此问题转化为判定序列减小必须有序即可,衍生出方法一二。
方法一:只看出栈和入栈的序列关系,那么出栈是的序列必定是有规律的,具体的关系是:对于任意序列编号,其右边比当前序列编号小的序列组合必定是降序。
1 //用通用方法处理,传入入栈和出栈的序列,返回两者是否满足要求 2 boolean isValid(Object[] seqIn, Object[] seqOut) { 3 Map<Object, Integer> map = new HashMap<>(); 4 int seq = 1; 5 //记录元素对应的序列 6 for (Object obj : seqIn) { 7 map.put(obj, seq++); 8 } 9 //判断每一个序列右边比其小的都是降序排列 10 for (int i = 0; i < seqOut.length; i++) { 11 seq = map.get(seqOut[i]); 12 for (int j = i + 1; j < seqOut.length; j++) { 13 if (map.get(seqOut[j]) < map.get(seqOut[i])) { 14 if (map.get(seqOut[j]) < seq) { 15 seq = map.get(seqOut[j]); 16 } else { 17 return false; 18 } 19 } 20 } 21 } 22 return true; 23 }