剑指Offer之栈的压入、弹出序列

题目描述

  输入两个整数序列,第一个序列表示栈的压入书序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的全部数字均不相同。例如一、二、三、四、5是某栈的压入序列,序列五、四、三、二、1是该栈对应的一个弹出序列,但四、三、五、一、2就不多是该压栈序列的弹出序列。java

基本思路

  设置两个索引pushIndex和popIndex,分别用于记录入栈元素的处理位置和出栈元素的处理位置,设置一个循环,当入栈元素还未所有入栈的条件下,若是栈为空,或者栈顶的元素不与当前处理的元素相等,则一直进行入栈操做,直到入栈元素所有入栈或者找到一个与栈顶元素相等的元素。若是在上一步入栈过程当中找到了与出栈与出栈元素相等的元素。将元素出栈,处理下一个元素。若是没有找到与出栈元素相等的元素,说明这个出栈顺序是不合法的,就返回false。数组

Java代码

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; } }
相关文章
相关标签/搜索