輸入兩個整數序列,第一個序列表示棧的壓入書序,請判斷第二個序列是否爲該棧的彈出順序。假設壓入棧的全部數字均不相同。例如一、二、三、四、5是某棧的壓入序列,序列五、四、三、二、1是該棧對應的一個彈出序列,但四、三、五、一、2就不多是該壓棧序列的彈出序列。java
設置兩個索引pushIndex和popIndex,分別用於記錄入棧元素的處理位置和出棧元素的處理位置,設置一個循環,當入棧元素還未所有入棧的條件下,若是棧爲空,或者棧頂的元素不與當前處理的元素相等,則一直進行入棧操做,直到入棧元素所有入棧或者找到一個與棧頂元素相等的元素。若是在上一步入棧過程當中找到了與出棧與出棧元素相等的元素。將元素出棧,處理下一個元素。若是沒有找到與出棧元素相等的元素,說明這個出棧順序是不合法的,就返回false。數組
package com.swordOffer.stackPushPopOrder14; import java.util.Scanner; import java.util.Stack; /** * Created by Feng on 2017/5/11. * 輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否爲該棧的彈出順序。 * 假設壓入棧的全部數字均不相等。例如列一、二、三、四、5是某棧的壓棧序列,序列五、四、三、二、1 * 是該棧對應的一個彈出序列,但四、三、五、一、2就不多是該壓棧序列的彈出序列。 */
public class StackPushPopOrder { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()) { int n = sc.nextInt();//數組的大小
int[] push = new int[n];//表示棧的壓入順序
for (int i = 0; i < n; i++) { push[i] = sc.nextInt(); } int[] pop = new int[n];//彈出順序
for (int i = 0; i < n; i++) { pop[i] = sc.nextInt(); } boolean result = isPopOrder(push, pop); System.out.println(result); } } /** * 判斷第二個序列是否爲該棧的探春序列 * * @param push * @param pop * @return
*/
private static boolean isPopOrder(int[] push, int[] pop) { boolean flag = false; Stack<Integer> stack = new Stack<>(); // 輸入校驗,參數不能爲空,而且兩個數組中必須有數字,而且兩個數組中的數字個數相同 // 不然返回false
if (push == null || pop == null || pop.length == 0 || push.length == 0
|| push.length != pop.length) { return false; } // 用於記錄入棧數組元素的處理位置
int pushIndex = 0; // 用於記錄出棧數組元素的處理位置
int popIndex = 0; // 若是還有出棧元素要處理
while (popIndex < pop.length) { // 入棧元素還未所有入棧的條件下,若是棧爲空, // 或者棧頂的元素不與當前處理的相等, // 則一直進行棧操做, // 直到入棧元素所有入棧或者找到了一個與當出棧元素相等的元素
while (pushIndex < push.length && (stack.isEmpty() || stack.peek() != pop[popIndex])) { // 入棧數組中的元素入棧
stack.push(push[pushIndex]); // 指向下一個要處理的入棧元素
pushIndex++; } //若是在上一步的入棧過程當中找到了與出棧的元素相等的元素
if (stack.peek() == pop[popIndex]) { // 將元素出棧
stack.pop(); // 處理下一個出棧元素
popIndex++; } // 若是沒有找到與出棧元素相等的元素,說明這個出棧順序是不合法的 // 就返回false
else { return false; } } return true; } }