/*
描述
輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否可能爲該棧的彈出順序。
假設壓入棧的所有數字均不相等。例如序列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");
}