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

Posted 白常福

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了入栈操作的合法性 重复元素相关的知识,希望对你有一定的参考价值。

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

* 若序列元素没有重复

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

 

以上是关于入栈操作的合法性 重复元素的主要内容,如果未能解决你的问题,请参考以下文章

给定入栈顺序,判断出栈顺序是否合法

算法习题---栈与队列之栈的数学性质

栈练习之Example006-判定给定的由 I 和 O 组成的入栈和出栈组成的操作序列是否合法

程序员面试冲刺,Leetcode946,合法的出栈序列

数据结构栈之计算后缀表达式

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