码迷,mamicode.com
首页 > 其他好文 > 详细

入栈操作的合法性 【重复元素】

时间:2018-03-03 14:05:59      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:[]   ash   编号   序列   color   log   转化   返回   ...   

问题描述:给定两个序列,判断是否为对应合法的入栈出栈序列?

* 若序列元素没有重复

我想到大概三种方式,三者的前置操作均为先将元素与序列对应起来,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     }

 

入栈操作的合法性 【重复元素】

标签:[]   ash   编号   序列   color   log   转化   返回   ...   

原文地址:https://www.cnblogs.com/baichangfu/p/8496317.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!