本文參考自《劍指offer》一書,代碼采用Java語言。
題目
輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1、2、3、4、5是某棧的壓棧序列,序列4、5、3、2、1是該壓棧序列對應的一個彈出序列,但4、3、5、1、2就不可能是該壓棧序列的彈出序列。
思路
建立一個棧,按照壓棧序列依次進行入棧操作,按出棧序列的順序依次彈出數字。在出棧時,若下一個要出棧的數字與棧頂數字相同則彈出。如果壓棧序列中的所有數字都入棧后沒有完全出棧成功則代表兩個序列不匹配,返回false。
測試算例
1.功能測試(兩個數組長度不同;兩個數組對應;兩個數組不對應)
2.特殊測試(數組為空;null;一個數字的數組)
Java代碼
//題目:輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是
//否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1、2、3、4、
//5是某棧的壓棧序列,序列4、5、3、2、1是該壓棧序列對應的一個彈出序列,但
//4、3、5、1、2就不可能是該壓棧序列的彈出序列。
public class StackPushPopOrder {
public boolean isPopOrder(int [] pushA,int [] popA) {
if(pushA==null || popA==null)
return false;
Stack<Integer> stack = new Stack<Integer>();
//必須提前判斷長度是否相等
if(popA.length!=pushA.length || pushA.length==0)
return false;
int popIndex=0;
for(int pushIndex=0; pushIndex<pushA.length; pushIndex++) {
stack.push(pushA[pushIndex]);
while(!stack.empty() &&stack.peek()==popA[popIndex]) {
stack.pop();
popIndex++;
}
}
return stack.empty();
}
}
收獲
通過舉例子,整理清楚邏輯順序:依次先入棧,再判斷是否出棧;出棧序列能實現棧的清空說明兩個序列匹配。
