數據結構之--棧混洗

/*
描述
輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否可能爲該棧的彈出順序。
假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的一個彈出序列,
但4,3,5,1,2就不可能是該壓棧序列的彈出序列。(注意:這兩個序列的長度是相等的)

輸入
第一行:輸入N個整數,空格隔開,按先後順序入棧
第二行:輸入N個整數,空格隔開,表示一種出棧順序
輸出
True 或者 False ,意思是第二行數據是否是一個合法的彈出序列
樣例輸入
1 2 3 4 5
4 5 3 2 1
樣例輸出
True
 */

這個題目折磨了我好幾日,今天仔細看了書上的代碼才寫出來

import java.util.Scanner;
import java.util.Stack;
public class Main{
    Scanner in = new Scanner(System.in);
    //首先這個輸入的問題 之前做題的時候習慣了用數組這個容器,題目也很給面子把數組的len給了,這個沒            //有,找了好久才知道直接行輸入然後轉成 數
    String s1 = in.nextLine();
    String s2 = in.nextLine();
    String a1[] = s1.split(" ");
    String a2[] = s2.split(" ");
    
    int a[] = new int[a1.length];    //a 是壓入棧的順序 從 0--a.length
    int b[] = new int[a1.length];     // b 是彈出的順序 從 0--b.length   
    
    Stack<Integer> s = new Stack<Integer>();
    
    for(int i = 0;i < a.length;i++){
        a[i] = Integer.valueOf(a1[i]);
        b[i] = Integer.valueOf(a2[i]);    
    }
    int k = 0;  
    for(int i = 0;i < a.length;i++){    
        try{
            while(s.peek() != b[i] || s.isEmpty()){        
                s.push(a[k++]);
            }//一直等到a[k]把第i要彈出時才截至循環

        }catch(Exception e){
            System.out.printn("False");
        }
        s.pop();     //只有當 s非空且s.peek() == b[i] 的時候才執行這一步  i才進行加一
    }
    
    System.out.printn("True");
    

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章