【Java】 劍指offer(31) 棧的壓入、彈出序列

本文參考自《劍指offer》一書,代碼採用Java語言。html

更多:《劍指Offer》Java實現合集  java

題目 

  輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否爲該棧的彈出順序。假設壓入棧的全部數字均不相等。例如序列一、二、三、四、5是某棧的壓棧序列,序列四、五、三、二、1是該壓棧序列對應的一個彈出序列,但四、三、五、一、2就不多是該壓棧序列的彈出序列。數組

思路

  創建一個棧,按照壓棧序列依次進行入棧操做,按出棧序列的順序依次彈出數字。在出棧時,若下一個要出棧的數字與棧頂數字相同則彈出。若是壓棧序列中的全部數字都入棧後沒有徹底出棧成功則表明兩個序列不匹配,返回false。post

測試算例 測試

  1.功能測試(兩個數組長度不一樣;兩個數組對應;兩個數組不對應)url

  2.特殊測試(數組爲空;null;一個數字的數組)spa

Java代碼

//題目:輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是
//否爲該棧的彈出順序。假設壓入棧的全部數字均不相等。例如序列一、二、三、四、
//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();
    }
}   

  

收穫

  經過舉例子,整理清楚邏輯順序:依次先入棧,再判斷是否出棧;出棧序列能實現棧的清空說明兩個序列匹配。htm

  

更多:《劍指Offer》Java實現合集  blog

相關文章
相關標籤/搜索