1. 程式人生 > >入棧操作的合法性 【重復元素】

入棧操作的合法性 【重復元素】

操作 boolean i++ 當前 seq 必須 shm 排列 ...

問題描述:給定兩個序列,判斷是否為對應合法的入棧出棧序列?

* 若序列元素沒有重復

我想到大概三種方式,三者的前置操作均為先將元素與序列對應起來,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 }

入棧操作的合法性 【重復元素】