剑指offer 31: 栈的压入、弹出序列

package com.example.lettcode.offer;

import java.util.Stack;

/**
 * @Class ValidateStackSequences
 * @Description 剑指offer 31 栈的压入、弹出序列
 * 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。
 * 假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈
 * 的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,
 * 但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。
 * <p>
 * 示例 1:
 * 输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]
 * 输出:true
 * 解释:我们可以按以下顺序执行:
 * push(1), push(2), push(3), push(4), pop() -> 4,
 * push(5), pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1
 * <p>
 * 示例 2:
 * 输入:pushed = [1,2,3,4,5], popped = [4,3,5,1,2]
 * 输出:false
 * 解释:1 不能在 2 之前弹出。
 * <p>
 * 提示:
 * 0 <= pushed.length == popped.length <= 1000
 * 0 <= pushed[i], popped[i] < 1000
 * pushed 是 popped 的排列。
 * @Author
 * @Date 2020/7/17
 **/
public class ValidateStackSequences {
    // 使用辅助栈
    public static boolean validateStackSequences(int[] pushed, int[] popped) {
        if (pushed.length != popped.length) return false;

        Stack<Integer> integerStack = new Stack<>();
        int locationFirst = 0;
        int locationSecond = 0;
        while (locationFirst < pushed.length && locationSecond < popped.length) {
            // 栈为空或者栈顶元素与poped 当前元素不相同,则pushed元素入栈
            while (integerStack.isEmpty()
                    || (locationFirst < pushed.length && integerStack.peek() != popped[locationSecond])) {
                integerStack.push(pushed[locationFirst]);
                locationFirst++;
            }
            // 栈顶元素和poped当前元素相等则栈顶出栈
            while (!integerStack.isEmpty()
                    && locationSecond < popped.length
                    && integerStack.peek() == popped[locationSecond]) {
                integerStack.pop();
                locationSecond++;
            }
        }

        // 结束循环,判断两指针是否均指向最后一个元素的位置,即是否相等
        return locationFirst == locationSecond;
    }

    public static void main(String[] args) {
        int[] pushed = new int[]{1, 2, 3, 4, 5};
        int[] poped = new int[]{4, 5, 3, 2, 1};
        boolean ans = validateStackSequences(pushed, poped);
        System.out.println("ValidateStackSequences demo01 result:" + ans);

        pushed = new int[]{1, 2, 3, 4, 5};
        poped = new int[]{4, 3, 5, 1, 2};
        ans = validateStackSequences(pushed, poped);
        System.out.println("ValidateStackSequences demo02 result:" + ans);
    }
}
原文地址:https://www.cnblogs.com/fyusac/p/13330041.html